Subversion Repositories pentevo

Rev

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

  1. #include "std.h"
  2.  
  3. #include "resource.h"
  4. #include "emul.h"
  5. #include "vars.h"
  6. #include "init.h"
  7. #include "dx.h"
  8. #include "draw.h"
  9. #include "dxrend.h"
  10. #include "dxrendch.h"
  11. #include "dxrframe.h"
  12. #include "dxr_text.h"
  13. #include "dxr_rsm.h"
  14. #include "dxr_advm.h"
  15. #include "dxovr.h"
  16. #include "dxerr.h"
  17. #include "sndrender/sndcounter.h"
  18. #include "sound.h"
  19. #include "savesnd.h"
  20. #include "emulkeys.h"
  21. #include "funcs.h"
  22. #include "util.h"
  23.  
  24.  
  25. #include "snapshot.h"   //фы  ьхэ■                      // [NS]
  26. #include "cheat.h"      //фы  ьхэ■                      // [NS]
  27. #include "dbgbpx.h"     //фы  ьхэ■                      // [NS]
  28. #include "dbgcmd.h"     //фы  ьхэ■                      // [NS]
  29. #include "debug.h"      //фы  dbg_force_exit            // [NS]
  30. #include "dbgpaint.h"   //фы  debugflip()               // [NS]
  31. #include "dbglabls.h"   //фы  mon_show_labels           // [NS]
  32. #include "dbgoth.h"     //mon_gsdialog()                // [NS]
  33. #include "tape.h"       //фы  ьхэ■ tape_infosiz         // [NS]
  34.  
  35. #include "debug_tools.h"        // фы  ёючфрэш  юъэр    // [NS]
  36.  
  37. unsigned char active = 0;
  38. unsigned char pause = 0;
  39.  
  40. // т√эхёхэю т resource.h
  41. //static const DWORD SCU_SCALE1 = 0x10;
  42. //static const DWORD SCU_SCALE2 = 0x20;
  43. //static const DWORD SCU_SCALE3 = 0x30;
  44. //static const DWORD SCU_SCALE4 = 0x40;
  45. //static const DWORD SCU_LOCK_MOUSE = 0x50;
  46.  
  47. #define MAXDSPIECE (48000 * 4 / 20)
  48. #define DSBUFFER_SZ (2 * conf.sound.fq * 4)
  49.  
  50. #define SLEEP_DELAY 2
  51.  
  52. static HMODULE D3d9Dll = nullptr;
  53. static IDirect3D9 *D3d9 = nullptr;
  54. static IDirect3DDevice9 *D3dDev = nullptr;
  55. static IDirect3DTexture9 *Texture = nullptr;
  56. static IDirect3DSurface9 *SurfTexture = nullptr;
  57.  
  58. LPDIRECTDRAW2 dd;
  59. LPDIRECTDRAWSURFACE sprim;
  60. LPDIRECTDRAWSURFACE surf0;
  61. LPDIRECTDRAWSURFACE surf1;
  62.  
  63. static LPDIRECTDRAWSURFACE surf2;
  64. static PVOID SurfMem1 = nullptr;
  65. static ULONG SurfPitch1 = 0;
  66.  
  67. static LPDIRECTINPUTDEVICE dikeyboard;
  68. static LPDIRECTINPUTDEVICE dimouse;
  69. LPDIRECTINPUTDEVICE2 dijoyst;
  70.  
  71. static LPDIRECTSOUND ds;
  72. static LPDIRECTSOUNDBUFFER dsbf;
  73. static LPDIRECTDRAWPALETTE pal;
  74. static LPDIRECTDRAWCLIPPER clip;
  75.  
  76. static unsigned dsoffset;
  77. static unsigned dsbuffer_sz;
  78.  
  79. static void FlipBltAlign4();
  80. static void FlipBltAlign16();
  81.  
  82. static void (*FlipBltMethod)() = nullptr;
  83.  
  84. static void StartD3d( HWND Wnd);
  85. static void DoneD3d( bool DeInitDll = true);
  86. static void SetVideoModeD3d( bool Exclusive);
  87.  
  88. static HMENU main_menu;         //TSL
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96. void reinit_sound_ds(); // [NS]
  97.  
  98.  
  99.  
  100. /* ---------------------- renders ------------------------- */
  101.  
  102. //=============================================================================
  103. RENDER renders[] =
  104. {
  105.     { "Normal",                         render_small,   "normal",       RF_DRIVER | RF_1X },
  106.     { "Double size",                    render_dbl,     "double",       RF_DRIVER | RF_2X },
  107.     { "Triple size",                    render_3x,      "triple",       RF_DRIVER | RF_3X },
  108.     { "Quad size",                      render_quad,    "quad",         RF_DRIVER | RF_4X },
  109.     { "Anti-Text64",                    render_text,    "text",         RF_DRIVER | RF_2X | RF_USEFONT },
  110.     { "Frame resampler",                render_rsm,     "resampler",    RF_DRIVER | RF_8BPCH },
  111.  
  112.     { "TV Emulation",                   render_tv,      "tv",           RF_YUY2 | RF_OVR },
  113.     { "Bilinear filter (MMX,fullscr)",  render_bil,     "bilinear",     RF_2X | RF_PALB },
  114.     { "Vector scaling (fullscr)",       render_scale,   "scale",        RF_2X },
  115.     { "AdvMAME scale (fullscr)",        render_advmame, "advmame",      RF_DRIVER },
  116.  
  117.     { "Chunky overlay (fast!)",               render_ch_ov,  "ch_ov",   RF_OVR  | 0*RF_128x96 | 0*RF_64x48 | RF_BORDER | RF_USE32AS16 },
  118.     { "Chunky 32bit hardware (flt,fullscr)",  render_ch_hw,  "ch_hw",   RF_CLIP | 0*RF_128x96 | 0*RF_64x48 | RF_BORDER | RF_32 | RF_USEC32 },
  119.  
  120.     { "Chunky 16bit, low-res, (flt,fullscr)", render_c16bl,  "ch_bl",   RF_16 | RF_BORDER |         RF_USEC32 },
  121.     { "Chunky 16bit, hi-res, (flt,fullscr)",  render_c16b,   "ch_b",    RF_16 | RF_2X | RF_BORDER | RF_USEC32 },
  122.     { "Ch4x4 true color (fullscr)",           render_c4x32b, "ch4true", RF_32 | RF_2X | RF_BORDER | RF_USEC32 },
  123.  
  124.     { nullptr,                          nullptr,        nullptr,        0 }
  125. };
  126.  
  127. size_t renders_count = _countof(renders);
  128.  
  129. //=============================================================================
  130. const RENDER drivers[] =
  131. {
  132.     { "Video Memory (8bpp) (Fullscr)"nullptr,        "ddraw",        RF_8    },
  133.     { "Video Memory (16bpp) (Fullscr)", nullptr,        "ddrawh",       RF_16   },
  134.     { "Video Memory (32bpp) (Fullscr)", nullptr,        "ddrawt",       RF_32   },
  135.     { "GDI Device Context",             nullptr,        "gdi",          RF_GDI  },
  136.     { "Overlay",                        nullptr,        "ovr",          RF_OVR  },
  137.     { "Hardware Blitter",               nullptr,        "blt",          RF_CLIP },
  138.     { "Hardware 3D",                    nullptr,        "d3d",          RF_D3D  },
  139.     { "Hardware 3D Exclusive (Fullscr)", nullptr,       "d3de",         RF_D3DE },
  140.     { nullptr,                          nullptr,        nullptr,        0       }
  141. };
  142. //=============================================================================
  143.  
  144.  
  145.  
  146.  
  147. //=============================================================================
  148. inline void switch_video()
  149. {
  150.     static unsigned char eff7 = u8(-1U);
  151.     //-------------------------------------------------------------------------
  152.     if ((comp.pEFF7 ^ eff7) & EFF7_HWMC)
  153.     {
  154.         video_timing_tables();
  155.         eff7 = comp.pEFF7;
  156.     }
  157.     //-------------------------------------------------------------------------
  158. }
  159. //=============================================================================
  160.  
  161.  
  162.  
  163.  
  164. //=============================================================================
  165. static void FlipGdi()
  166. {
  167.     // юъэю фхсрухЁр ЁшёєхЄёю т фЁєуюь ьхёЄх
  168.    
  169.     //-------------------------------------------------------------------------
  170.     if (needclr)
  171.     {
  172.         needclr--;
  173.         gdi_frame();
  174.     }
  175.     //-------------------------------------------------------------------------
  176.     renders[ conf.render].func( gdibuf, temp.ox * temp.obpp / 8); // render to memory buffer
  177.  
  178.     //printf("XX ");
  179.     // copy bitmap to gdi dc
  180.     SetDIBitsToDevice(  temp.gdidc,     //HDC hdc
  181.                        
  182.                         int (temp.gx)//int xDest
  183.                         int (temp.gy)//int yDest
  184.                         temp.ox,        //DWORD w
  185.                         temp.oy,        //DWORD h
  186.                        
  187.                         0,              //int xSrc
  188.                         0,              //int ySrc
  189.                         0,              //UINT StartScan
  190.                         temp.oy,        //UINT cLines
  191.                        
  192.                         gdibuf,         //CONST VOID *lpvBits
  193.                         &gdibmp.header, //CONST BITMAPINFO *lpbmi
  194.                         DIB_RGB_COLORS  //UINT ColorUse
  195.                       );
  196.     //-------------------------------------------------------------------------
  197.     // ърър Єю уюЁюфєїр юЄ NS фы  "Ёшёютрэш  ўхЁэющ Ёрьюўъш т Ёхцшьх gdi
  198.     // эртхЁэюх ыєў°х ёфхырЄ№ 4/8 ътфрЁрЄют
  199.     PAINTSTRUCT ps;
  200.     HDC hdc = BeginPaint( wnd, &ps);
  201.     //-------------------------------------------------------------------------
  202.     RECT rect;
  203.     RECT draw_rect;
  204.     GetClientRect(wnd, &rect);
  205.     HBRUSH hbrush = CreateSolidBrush( RGB( 0x00, 0x00, 0x00));
  206.     //-------------------------------------------------------------------------
  207.     // 11111
  208.     // 3 . 4
  209.     // 22222
  210.     draw_rect.top = rect.top;                   // 11111
  211.     draw_rect.left = rect.left;
  212.     draw_rect.right = rect.right;
  213.     draw_rect.bottom = temp.gy; //-1;
  214.     FillRect( hdc, &draw_rect, hbrush );
  215.  
  216.     draw_rect.top = temp.gy + temp.oy; //+1;    // 22222
  217. //  draw_rect.left = rect.left;
  218. //  draw_rect.right = rect.right;
  219.     draw_rect.bottom = rect.bottom;
  220.     FillRect( hdc, &draw_rect, hbrush );
  221.        
  222.     draw_rect.top = temp.gy;                    // 3....
  223. //  draw_rect.left = rect.left;
  224.     draw_rect.right = temp.gx; //-1
  225.     draw_rect.bottom = temp.gy + temp.oy;
  226.     FillRect( hdc, &draw_rect, hbrush );
  227.                
  228.     draw_rect.top = temp.gy;                    // ....4
  229.     draw_rect.left = temp.gx + temp.ox; //+1
  230.     draw_rect.right = rect.right;
  231.     draw_rect.bottom = temp.gy + temp.oy;
  232.     FillRect( hdc, &draw_rect, hbrush );
  233.     //-------------------------------------------------------------------------
  234.     EndPaint( wnd, &ps);
  235.    
  236.     DeleteObject( hbrush);
  237.     //-------------------------------------------------------------------------
  238. }
  239. //=============================================================================
  240.  
  241.  
  242.  
  243.  
  244. //=============================================================================
  245. static void FlipBltAlign16()
  246. {
  247.     // ╬ЄЁшёютър т сєЇхЁ т√Ёртэхээ√щ эр 16 срщЄ (эхюсїюфшью фы  чряшёш ўхЁхч sse2)
  248.     renders[conf.render].func(PUCHAR(SurfMem1), SurfPitch1);
  249.  
  250. restore_lost:;
  251.     DDSURFACEDESC desc;
  252.     desc.dwSize = sizeof(desc);
  253.     HRESULT r = surf1->Lock(nullptr, &desc, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT | DDLOCK_WRITEONLY, nullptr);
  254.     //-------------------------------------------------------------------------
  255.     if (r != DD_OK)
  256.     {
  257.         //---------------------------------------------------------------------
  258.         if (r == DDERR_SURFACELOST)
  259.         {
  260.             surf1->Restore();
  261.             HRESULT r2 = surf1->IsLost();
  262.             //-----------------------------------------------------------------
  263.             if (r2 == DDERR_SURFACELOST)
  264.                 Sleep(1);
  265.             //-----------------------------------------------------------------
  266.             if ((r2 == DD_OK) || (r2 == DDERR_SURFACELOST))
  267.                 goto restore_lost;
  268.             //-----------------------------------------------------------------
  269.         }
  270.         //---------------------------------------------------------------------
  271.         if (!active)
  272.             return;
  273.         //---------------------------------------------------------------------
  274.         printrdd("IDirectDrawSurface2::Lock() [buffer]", r);
  275.         exit();
  276.     }
  277.     //-------------------------------------------------------------------------
  278.     PUCHAR SrcPtr, DstPtr;
  279.     SrcPtr = PUCHAR(SurfMem1);
  280.     DstPtr = PUCHAR(desc.lpSurface);
  281.     //-------------------------------------------------------------------------
  282.     size_t LineSize = temp.ox * (temp.obpp >> 3);
  283.     //-------------------------------------------------------------------------
  284.     for (unsigned y = 0;    y < temp.oy;    y++)
  285.     {
  286.         memcpy(DstPtr, SrcPtr, LineSize);
  287.         SrcPtr += SurfPitch1;
  288.         DstPtr += desc.lPitch;
  289.     }
  290.     //-------------------------------------------------------------------------
  291.     r = surf1->Unlock(nullptr);
  292.     //-------------------------------------------------------------------------
  293.     if (r != DD_OK)
  294.     {
  295.         //---------------------------------------------------------------------
  296.         if (r == DDERR_SURFACELOST)
  297.         {
  298.             surf1->Restore();
  299.             HRESULT r2 = surf1->IsLost();
  300.             //-----------------------------------------------------------------
  301.             if (r2 == DDERR_SURFACELOST)
  302.                 Sleep(1);
  303.             //-----------------------------------------------------------------
  304.             if ((r2 == DD_OK) || (r2 == DDERR_SURFACELOST))
  305.                 goto restore_lost;
  306.             //-----------------------------------------------------------------
  307.         }
  308.         //---------------------------------------------------------------------
  309.         printrdd("IDirectDrawSurface2::Unlock() [buffer]", r);
  310.         exit();
  311.     }
  312. }
  313. //=============================================================================
  314.  
  315.  
  316.  
  317.  
  318. //=============================================================================
  319. static void FlipBltAlign4()
  320. {
  321.  
  322. restore_lost:;
  323.    
  324.     DDSURFACEDESC desc;
  325.     desc.dwSize = sizeof(desc);
  326.     HRESULT r = surf1->Lock(nullptr, &desc, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT | DDLOCK_WRITEONLY, nullptr);
  327.     //-------------------------------------------------------------------------
  328.     if (r != DD_OK)
  329.     {
  330.         //---------------------------------------------------------------------
  331.         if (r == DDERR_SURFACELOST)
  332.         {
  333.             surf1->Restore();
  334.             HRESULT r2 = surf1->IsLost();
  335.             //-----------------------------------------------------------------
  336.             if (r2 == DDERR_SURFACELOST)
  337.                 Sleep(1);
  338.             //-----------------------------------------------------------------
  339.             if ((r2 == DD_OK) || (r2 == DDERR_SURFACELOST))
  340.                 goto restore_lost;
  341.             //-----------------------------------------------------------------
  342.         }
  343.         //---------------------------------------------------------------------
  344.         if (!active)
  345.             return;
  346.         //---------------------------------------------------------------------
  347.         printrdd("IDirectDrawSurface2::Lock() [buffer]", r);
  348.         exit();
  349.     }
  350.     //-------------------------------------------------------------------------
  351.     // ╬ЄЁшёютър т сєЇхЁ т√Ёртэхээ√щ эр 4 срщЄр
  352.     renders[conf.render].func( PUCHAR( desc.lpSurface), unsigned( desc.lPitch));
  353.  
  354.     r = surf1->Unlock(nullptr);
  355.     //-------------------------------------------------------------------------
  356.     if (r != DD_OK)
  357.     {
  358.         //---------------------------------------------------------------------
  359.         if (r == DDERR_SURFACELOST)
  360.         {
  361.             surf1->Restore();
  362.             HRESULT r2 = surf1->IsLost();
  363.             //-----------------------------------------------------------------
  364.             if (r2 == DDERR_SURFACELOST)
  365.                 Sleep(1);
  366.             //-----------------------------------------------------------------
  367.             if ((r2 == DD_OK) || (r2 == DDERR_SURFACELOST))
  368.                 goto restore_lost;
  369.             //-----------------------------------------------------------------
  370.         }
  371.         //---------------------------------------------------------------------
  372.         printrdd("IDirectDrawSurface2::Unlock() [buffer]", r);
  373.         exit();
  374.     }
  375.     //-------------------------------------------------------------------------
  376. }
  377. //=============================================================================
  378.  
  379.  
  380.  
  381.  
  382. //=============================================================================
  383. static bool CalcFlipRect( LPRECT R)
  384. {
  385.     int w = temp.client.right - temp.client.left;
  386.     int h = temp.client.bottom - temp.client.top;
  387.     int n = min( w / int( temp.ox), h / int( temp.oy));
  388.  
  389.     POINT P = { 0, 0 };
  390.     ClientToScreen( wnd, &P);
  391.     int x0 = P.x;
  392.     int y0 = P.y;
  393.     R->left =   (w - (int(temp.ox) * n)) / 2;
  394.     R->right =  (w + (int(temp.ox) * n)) / 2;
  395.     R->top =    (h - (int(temp.oy) * n)) / 2;
  396.     R->bottom = (h + (int(temp.oy) * n)) / 2;
  397.     OffsetRect(R, x0, y0);
  398.     return IsRectEmpty(R) == FALSE;
  399. }
  400. //=============================================================================
  401.  
  402.  
  403.  
  404.  
  405. //=============================================================================
  406. static void FlipBlt()
  407. {
  408.     HRESULT r;
  409.  
  410. restore_lost:;
  411.  
  412.     FlipBltMethod();
  413.  
  414.     assert(!IsRectEmpty(&temp.client));
  415.  
  416.     DDBLTFX Fx;
  417.     Fx.dwSize = sizeof(Fx);
  418.     Fx.dwDDFX = 0;
  419.  
  420.     RECT R;
  421.     //-------------------------------------------------------------------------
  422.     if (!CalcFlipRect(&R))
  423.         return;
  424.     //-------------------------------------------------------------------------
  425.     // ╬ўшёЄър back сєЇхЁр
  426.     Fx.dwFillColor = 0;
  427.     r = surf2->Blt(nullptr, nullptr, nullptr, DDBLT_WAIT | DDBLT_ASYNC |  DDBLT_COLORFILL, &Fx);
  428.     //-------------------------------------------------------------------------
  429.     if (r != DD_OK)
  430.     {
  431.         //---------------------------------------------------------------------
  432.         if (r == DDERR_SURFACELOST)
  433.         {
  434.             surf2->Restore();
  435.             //-----------------------------------------------------------------
  436.             if (surf2->IsLost() == DDERR_SURFACELOST)
  437.                 Sleep(1);
  438.             //-----------------------------------------------------------------
  439.             goto restore_lost;
  440.         }
  441.         //---------------------------------------------------------------------
  442.         printrdd("IDirectDrawSurface2::Blt(1)", r);
  443.         exit();
  444.     }
  445.     //-------------------------------------------------------------------------
  446.     // ╨шёютрэшх ърЁЄшэъш ё ьрё°ЄрсшЁютрэшхь т n Ёрч шч surf1 (320x240) -> surf2 (ЁрчьхЁ ¤ъЁрэр)
  447.     r = surf2->Blt(&R, surf1, nullptr, DDBLT_WAIT | DDBLT_ASYNC | DDBLT_DDFX, &Fx);
  448.     //-------------------------------------------------------------------------
  449.     if (r != DD_OK)
  450.     {
  451.         //---------------------------------------------------------------------
  452.         if (r == DDERR_SURFACELOST)
  453.         {
  454.             surf1->Restore();
  455.             surf2->Restore();
  456.             //-----------------------------------------------------------------
  457.             if ((surf1->IsLost() == DDERR_SURFACELOST) || (surf2->IsLost() == DDERR_SURFACELOST))
  458.                 Sleep(1);
  459.             //-----------------------------------------------------------------
  460.             goto restore_lost;
  461.         }
  462.         //---------------------------------------------------------------------
  463.         printrdd("IDirectDrawSurface2::Blt(2)", r);
  464.         exit();
  465.     }
  466.     //-------------------------------------------------------------------------
  467.     // ╩юяшЁютрэшх surf2 эр surf0 (¤ъЁрэ, ЁрчьхЁ ¤ъЁрэр)
  468.     r = surf0->Blt(nullptr, surf2, nullptr, DDBLT_WAIT | DDBLT_ASYNC | DDBLT_DDFX, &Fx);
  469.     //-------------------------------------------------------------------------
  470.     if (r != DD_OK)
  471.     {
  472.         //---------------------------------------------------------------------
  473.         if (r == DDERR_SURFACELOST)
  474.         {
  475.             surf0->Restore();
  476.             surf2->Restore();
  477.             //-----------------------------------------------------------------
  478.             if ((surf0->IsLost() == DDERR_SURFACELOST) || (surf2->IsLost() == DDERR_SURFACELOST))
  479.                 Sleep(1);
  480.             //-----------------------------------------------------------------
  481.             goto restore_lost;
  482.         }
  483.         //---------------------------------------------------------------------
  484.         printrdd("IDirectDrawSurface2::Blt(3)", r);
  485.         exit();
  486.     }
  487. }
  488. //=============================================================================
  489.  
  490.  
  491.  
  492.  
  493. //=============================================================================
  494. static bool CalcFlipRectD3d(LPRECT R)
  495. {
  496.     int w = temp.client.right - temp.client.left;
  497.     int h = temp.client.bottom - temp.client.top;
  498.     int n = min(w / int(temp.ox), h / int(temp.oy));
  499.  
  500.     R->left =   ( w - ( int( temp.ox) *n )) / 2;
  501.     R->right =  ( w + ( int( temp.ox) *n )) / 2;
  502.     R->top =    ( h - ( int( temp.oy) *n )) / 2;
  503.     R->bottom = ( h + ( int( temp.oy) *n )) / 2;
  504.  
  505.     return IsRectEmpty(R) == FALSE;
  506. }
  507. //=============================================================================
  508.  
  509.  
  510.  
  511.  
  512. //=============================================================================
  513. static void FlipD3d()
  514. {
  515.     //-------------------------------------------------------------------------
  516.     if (!SUCCEEDED(D3dDev->BeginScene()))
  517.         return;
  518.     //-------------------------------------------------------------------------
  519.     HRESULT Hr;
  520.     IDirect3DSurface9 *SurfBackBuffer0 = nullptr;
  521.  
  522.     Hr = D3dDev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &SurfBackBuffer0);
  523.     //-------------------------------------------------------------------------
  524.     if (Hr != DD_OK)
  525.     {
  526.         printrdd("IDirect3DDevice9::GetBackBuffer(0)", Hr);
  527.         exit();
  528.     }
  529.     //-------------------------------------------------------------------------
  530.  
  531.     D3DLOCKED_RECT Rect = { };
  532.  
  533.     Hr = SurfTexture->LockRect(&Rect, nullptr, D3DLOCK_DISCARD);
  534.     //-------------------------------------------------------------------------
  535.     if (FAILED(Hr))
  536.     {
  537.         printrdd("IDirect3DDevice9::LockRect()", Hr);
  538. //        __debugbreak();
  539.         exit();
  540.     }
  541.     //-------------------------------------------------------------------------
  542.  
  543.     renders[conf.render].func((u8 *)Rect.pBits, unsigned(Rect.Pitch));
  544.  
  545.     Hr = SurfTexture->UnlockRect();
  546.     //-------------------------------------------------------------------------
  547.     if (FAILED(Hr))
  548.     {
  549.         printrdd("IDirect3DDevice9::UnlockRect()", Hr);
  550.         //        __debugbreak();
  551.         exit();
  552.     }
  553.     //-------------------------------------------------------------------------
  554.     Hr = D3dDev->ColorFill(SurfBackBuffer0, nullptr, D3DCOLOR_XRGB(0, 0, 0));
  555.     //-------------------------------------------------------------------------
  556.     if (FAILED(Hr))
  557.     {
  558.         printrdd("IDirect3DDevice9::ColorFill()", Hr);
  559.         //      __debugbreak();
  560.         exit();
  561.     }
  562.     //-------------------------------------------------------------------------
  563.  
  564.     RECT R;
  565.     //-------------------------------------------------------------------------
  566.     if (!CalcFlipRectD3d(&R))
  567.     {
  568.         D3dDev->EndScene();
  569.         SurfBackBuffer0->Release();
  570.         return;
  571.     }
  572.     //-------------------------------------------------------------------------
  573.     Hr = D3dDev->StretchRect(SurfTexture, nullptr, SurfBackBuffer0, &R, D3DTEXF_POINT);
  574.     //-------------------------------------------------------------------------
  575.     if (FAILED(Hr))
  576.     {
  577.         printrdd("IDirect3DDevice9::StretchRect()", Hr);
  578.         //      __debugbreak();
  579.         exit();
  580.     }
  581.     //-------------------------------------------------------------------------
  582.     D3dDev->EndScene();
  583.  
  584.     // Present the backbuffer contents to the display
  585.     Hr = D3dDev->Present(nullptr, nullptr, nullptr, nullptr);
  586.     SurfBackBuffer0->Release();
  587.     //-------------------------------------------------------------------------
  588.     if (FAILED(Hr))
  589.     {
  590.         //---------------------------------------------------------------------
  591.         if (Hr == D3DERR_DEVICELOST)
  592.         {
  593.             SetVideoModeD3d( (temp.rflags & RF_D3DE) != 0);
  594.             return;
  595.         }
  596.         //---------------------------------------------------------------------
  597.         printrdd("IDirect3DDevice9::Present()", Hr);
  598.         //        __debugbreak();
  599.         exit();
  600.     }
  601.     //-------------------------------------------------------------------------
  602. }
  603. //=============================================================================
  604.  
  605.  
  606.  
  607.  
  608. //=============================================================================
  609. static void FlipVideoMem()
  610. {
  611.         //printf("FlipVideoMem()\n");
  612.  
  613.     // draw direct to video memory, overlay
  614.     LPDIRECTDRAWSURFACE drawsurf = conf.flip  ?  surf1 :
  615.                                                  surf0;
  616.  
  617.     DDSURFACEDESC desc;
  618.     desc.dwSize = sizeof desc;
  619.  
  620. restore_lost:;
  621.  
  622.     HRESULT r = drawsurf->Lock(nullptr, &desc, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT | DDLOCK_WRITEONLY, nullptr);
  623.     //-------------------------------------------------------------------------
  624.     if (r != DD_OK)
  625.     {
  626.         //---------------------------------------------------------------------
  627.         if (!active)
  628.             return;
  629.         //---------------------------------------------------------------------
  630.         if (r == DDERR_SURFACELOST)
  631.         {
  632.             //printf("(r == DDERR_SURFACELOST)\n");
  633.             drawsurf->Restore();
  634.             //-----------------------------------------------------------------
  635.             if (drawsurf->IsLost() == DDERR_SURFACELOST)
  636.                 Sleep(1);
  637.             //-----------------------------------------------------------------
  638.             goto restore_lost;
  639.         }
  640.         //---------------------------------------------------------------------
  641.         printrdd("IDirectDrawSurface2::Lock()", r);
  642.         if (!exitflag)
  643.             exit();
  644.         //---------------------------------------------------------------------
  645.     }
  646.     //-------------------------------------------------------------------------
  647.     if (needclr)
  648.     {
  649.         //printf("needclr\n");
  650.         needclr--;
  651.         _render_black((unsigned char*)desc.lpSurface, unsigned(desc.lPitch));
  652.     }
  653.     //-------------------------------------------------------------------------
  654.     renders[conf.render].func((unsigned char*)desc.lpSurface + unsigned(desc.lPitch)*temp.ody + temp.odx, unsigned(desc.lPitch));
  655.     drawsurf->Unlock(nullptr);
  656.     //-------------------------------------------------------------------------
  657.     if (conf.flip) // draw direct to video memory
  658.     {
  659.         //printf("conf.flip\n");        //not overlay?
  660.         r = surf0->Flip(nullptr, DDFLIP_WAIT);
  661.         //---------------------------------------------------------------------
  662.         if (r != DD_OK)
  663.         {
  664.             //-----------------------------------------------------------------
  665.             if (r == DDERR_SURFACELOST)
  666.             {
  667.                 surf0->Restore();
  668.                 //-------------------------------------------------------------
  669.                 if (surf0->IsLost() == DDERR_SURFACELOST)
  670.                   Sleep(1);
  671.                 //-------------------------------------------------------------
  672.                 goto restore_lost;
  673.             }
  674.             //-----------------------------------------------------------------
  675.             printrdd("IDirectDrawSurface2::Flip()", r);
  676.             exit();
  677.         }
  678.         //---------------------------------------------------------------------
  679.     }
  680.     //-------------------------------------------------------------------------
  681. }
  682. //=============================================================================
  683.  
  684.  
  685.  
  686.  
  687. //=============================================================================
  688. // flip тёхую ш ёЁрчє
  689. void flip()
  690. {
  691.  
  692.     //-------------------------------------------------------------------------
  693.     // debug tools [NS]
  694.  
  695.     //-------------------------------------------------------------------------
  696.     for (int cnt = 0;    cnt < DEBUG_TOOLS_MAX_COUNT;    cnt++)
  697.     {
  698.         //---------------------------------------------------------------------
  699.         // юсэюты хь Єюы№ъю юЄъЁ√Є√х юъэр
  700.         if (debug_tool_exist[ cnt])
  701.         {
  702.             InvalidateRect( debug_tool_hwnd[cnt], NULL, FALSE); // эх ёЄшЁрЄ№ Їюэ
  703.             UpdateWindow(   debug_tool_hwnd[cnt]);              // [NS] test
  704.         }
  705.         //---------------------------------------------------------------------
  706.     }
  707.     //-------------------------------------------------------------------------
  708. //  InvalidateRect( debug_tool_hwnd[0], NULL, FALSE);   // эх ёЄшЁрЄ№ Їюэ
  709. //  UpdateWindow(   debug_tool_hwnd[0]);                // [NS] test
  710. //  InvalidateRect( debug_tool_hwnd[1], NULL, FALSE);   // эх ёЄшЁрЄ№ Їюэ
  711. //  UpdateWindow(   debug_tool_hwnd[1]);                // [NS] test
  712. //  InvalidateRect( debug_tool_hwnd[2], NULL, FALSE);   // эх ёЄшЁрЄ№ Їюэ
  713. //  UpdateWindow(   debug_tool_hwnd[2]);                // [NS] test
  714.  
  715.     //-------------------------------------------------------------------------
  716.     if (temp.Minimized)
  717.         return;
  718.     //-------------------------------------------------------------------------
  719.     switch_video();
  720.     //-------------------------------------------------------------------------
  721.     if (conf.flip && (temp.rflags & (RF_GDI | RF_CLIP)))
  722.         dd->WaitForVerticalBlank( DDWAITVB_BLOCKBEGIN, nullptr);
  723.     //-------------------------------------------------------------------------
  724.     // gdi
  725.     if (temp.rflags & RF_GDI)
  726.     {
  727.         FlipGdi();
  728.         return;
  729.     }
  730.     //-------------------------------------------------------------------------
  731.     if (surf0 && (surf0->IsLost() == DDERR_SURFACELOST))
  732.         surf0->Restore();
  733.     //-------------------------------------------------------------------------
  734.     if (surf1 && (surf1->IsLost() == DDERR_SURFACELOST))
  735.         surf1->Restore();
  736.     //-------------------------------------------------------------------------
  737.     // hardware blitter
  738.     if (temp.rflags & RF_CLIP)
  739.     {
  740.         //---------------------------------------------------------------------
  741.         // client area is empty
  742.         if (IsRectEmpty( &temp.client))
  743.             return;
  744.         //---------------------------------------------------------------------
  745.         FlipBlt();
  746.         return;
  747.     }
  748.     //-------------------------------------------------------------------------
  749.     // direct 3d
  750.     if (temp.rflags & (RF_D3D | RF_D3DE))
  751.     {
  752.         //-------------------------------------------------------------------------
  753.         // client area is empty
  754.         if (IsRectEmpty( &temp.client))
  755.             return;
  756.         //-------------------------------------------------------------------------
  757.         FlipD3d();
  758.         return;
  759.     }
  760.     //-------------------------------------------------------------------------
  761.     // overlay
  762.     if (temp.rflags & RF_OVR)   // [NS]
  763.     {
  764.         if (sprim) //їч ўх ¤Єю эю яєёЄ№ сєфхЄ фы  эрфхцэюёЄх (яю шфхш sprim ¤Єю ютхЁыхщ?)
  765.         {
  766.             update_overlay();   // ЄєЄ тююс∙х эх с√ыю юсэютыхэш  !!!
  767.         }
  768.     }
  769.     //-------------------------------------------------------------------------
  770.  
  771.     // draw direct to video memory, overlay
  772.     FlipVideoMem();             // ьюцхЄ юэю фюыцэю с√ыю т√ч√трЄ№ update_overlay?
  773. }
  774. //=============================================================================
  775.  
  776.  
  777. //=============================================================================
  778. static HWAVEOUT hwo = nullptr;
  779. static WAVEHDR wq[MAXWQSIZE];
  780. static unsigned char wbuffer[MAXWQSIZE*MAXDSPIECE];
  781. static unsigned wqhead;
  782. static unsigned wqtail;
  783. //=============================================================================
  784. void __fastcall do_sound_none()
  785. {
  786.  
  787. }
  788. //=============================================================================
  789. void __fastcall do_sound_wave()
  790. {
  791.     MMRESULT r;
  792.     //-------------------------------------------------------------------------
  793.     for (    ;    ;    ) // release all done items
  794.     {
  795.         //---------------------------------------------------------------------
  796.         while ((wqtail != wqhead) && (wq[wqtail].dwFlags & WHDR_DONE))
  797.         { // ready!
  798.             //-----------------------------------------------------------------
  799.             if ((r = waveOutUnprepareHeader(hwo, &wq[wqtail], sizeof(WAVEHDR))) != MMSYSERR_NOERROR)
  800.             {
  801.                 printrmm("waveOutUnprepareHeader()", r);
  802.                 exit();
  803.             }
  804.             //-----------------------------------------------------------------
  805.             if (++wqtail == conf.soundbuffer)
  806.                 wqtail = 0;
  807.             //-----------------------------------------------------------------
  808.         }
  809.         //---------------------------------------------------------------------
  810.         if ( (wqhead + 1) % conf.soundbuffer != wqtail)
  811.             break; // some empty item in queue
  812.         //---------------------------------------------------------------------
  813. /* [vv] */
  814.         //---------------------------------------------------------------------
  815.         if (conf.sleepidle)
  816.             Sleep( SLEEP_DELAY);
  817.         //---------------------------------------------------------------------
  818.     }
  819.     //-------------------------------------------------------------------------
  820.     if (!spbsize)
  821.         return;
  822.     //-------------------------------------------------------------------------
  823.     //   __debugbreak();
  824.     // put new item and play
  825.     PCHAR bfpos = PCHAR(wbuffer + wqhead*MAXDSPIECE);
  826.     memcpy(bfpos, sndplaybuf, spbsize);
  827.     wq[wqhead].lpData = bfpos;
  828.     wq[wqhead].dwBufferLength = spbsize;
  829.     wq[wqhead].dwFlags = 0;
  830.     //-------------------------------------------------------------------------
  831.     if ((r = waveOutPrepareHeader(hwo, &wq[wqhead], sizeof(WAVEHDR))) != MMSYSERR_NOERROR)
  832.     {
  833.         printrmm("waveOutPrepareHeader()", r);
  834.         exit();
  835.     }
  836.     //-------------------------------------------------------------------------
  837.     if ((r = waveOutWrite(hwo, &wq[wqhead], sizeof(WAVEHDR))) != MMSYSERR_NOERROR)
  838.     {
  839.         printrmm("waveOutWrite()", r);
  840.         exit();
  841.     }
  842.     //-------------------------------------------------------------------------
  843.     if (++wqhead == conf.soundbuffer)
  844.         wqhead = 0;
  845.     //-------------------------------------------------------------------------
  846.    
  847. //  int bs = wqhead-wqtail;
  848. //  if (bs < 0) bs += conf.soundbuffer;
  849. //  if (bs < 8) goto again;
  850.  
  851. }
  852. //=============================================================================
  853.  
  854.  
  855.  
  856.  
  857. //=============================================================================
  858. // directsound part
  859. // begin
  860. //=============================================================================
  861. static void restore_sound_buffer()
  862. {
  863. //  for (;;)
  864. //  {
  865.     DWORD status = 0;
  866.     dsbf->GetStatus(&status);
  867.     //-------------------------------------------------------------------------
  868.     if (status & DSBSTATUS_BUFFERLOST)
  869.     {
  870.           printf("%s\n", __FUNCTION__);
  871.           Sleep(18);
  872.           dsbf->Restore();
  873.           // Sleep(200);
  874.     }
  875.     //-------------------------------------------------------------------------
  876. //      else break;
  877. //  }
  878. }
  879. //=============================================================================
  880.  
  881.  
  882. //=============================================================================
  883. //static void clear_buffer()
  884. extern void clear_buffer()
  885. {
  886. //  printf("%s\n", __FUNCTION__);
  887. //  __debugbreak();
  888.  
  889.     restore_sound_buffer();
  890.     HRESULT r;
  891.     void *ptr1, *ptr2;
  892.     DWORD sz1, sz2;
  893.     r = dsbf->Lock( 0, 0, &ptr1, &sz1, &ptr2, &sz2, DSBLOCK_ENTIREBUFFER);
  894.     //-------------------------------------------------------------------------
  895.     if (r != DS_OK)
  896.         return;
  897.     //-------------------------------------------------------------------------
  898.     memset( ptr1, 0, sz1);
  899.     //memset(ptr2, 0, sz2);
  900.     dsbf->Unlock( ptr1, sz1, ptr2, sz2);
  901. }
  902. //=============================================================================
  903.  
  904.  
  905.  
  906.  
  907. //=============================================================================
  908.  
  909. static int maxgap;
  910.  
  911. //=============================================================================
  912. void __fastcall do_sound_ds()
  913. {
  914.     HRESULT r;
  915.     //-------------------------------------------------------------------------
  916.     do
  917.     {
  918.         int play;
  919.         int write;
  920.         //---------------------------------------------------------------------
  921.         if ((r = dsbf->GetCurrentPosition( (DWORD*) &play, (DWORD*) &write)) != DS_OK)
  922.         {
  923.             //-----------------------------------------------------------------
  924.             if (r == DSERR_BUFFERLOST)
  925.             {
  926.                 restore_sound_buffer();
  927.                 return;
  928.             }
  929.             //-----------------------------------------------------------------
  930.             if (r == DSERR_NODRIVER)    //USB AUDIO юЄяры       // [NS]
  931.             {
  932.                 if (MessageBox( wnd, "Sound\nGetCurrentPosition DSERR_NODRIVER CRASH.\nReinit sound?", "Unreal", MB_YESNO | MB_ICONERROR | MB_SETFOREGROUND) == IDYES)
  933.                 {
  934.                     reinit_sound_ds();
  935.                     restore_sound_buffer();
  936.                     //фры№°х ь√ ыютшь
  937.                     //DirectSoundCreate(): 0x88780078, DSERR_NODRIVER
  938.                     //goto error_skip;
  939.                     return;
  940.                 }
  941.             }
  942.             //-----------------------------------------------------------------
  943.             printrds("IDirectSoundBuffer::GetCurrentPosition()", r);
  944.             exit();
  945.         }
  946.         //---------------------------------------------------------------------
  947.         int gap = write - play;
  948.         //---------------------------------------------------------------------
  949.         if (gap < 0)
  950.             gap += dsbuffer_sz;
  951.         //---------------------------------------------------------------------
  952.         int pos = int( dsoffset) - play;
  953.         //---------------------------------------------------------------------
  954.         if (pos < 0)
  955.             pos += dsbuffer_sz;
  956.         //---------------------------------------------------------------------
  957.         maxgap = max( maxgap, gap);
  958.         //---------------------------------------------------------------------
  959.         if (pos < maxgap || pos > 10 * (int) maxgap)
  960.         {
  961.             dsoffset = unsigned( 3 * maxgap);
  962.             clear_buffer();
  963.             dsbf->Stop();
  964.             dsbf->SetCurrentPosition( 0);
  965.             break;
  966.         }
  967.         //---------------------------------------------------------------------
  968.         if (pos < 2 * maxgap)
  969.             break;
  970.         //---------------------------------------------------------------------
  971.         if ((r = dsbf->Play( 0, 0, DSBPLAY_LOOPING)) != DS_OK)
  972.         {
  973.             //-----------------------------------------------------------------
  974.             if (r == DSERR_BUFFERLOST)
  975.             {
  976.                 restore_sound_buffer();
  977.                 return;
  978.             }
  979.             //-----------------------------------------------------------------
  980.             if (r == AUDCLNT_E_DEVICE_IN_USE)
  981.             {
  982.                 printrds("IDirectSoundBuffer::Play()", r);
  983.                 printf("sound device is used exclusively by another apllication, switching to no sound mode\n");
  984.                 conf.sound.do_sound = do_sound_none;
  985.                 return;
  986.             }
  987.             //-----------------------------------------------------------------
  988.             // їч ёЁрсрЄ√трхЄ ыш юэю ЄєЄ
  989.             if (r == DSERR_NODRIVER)    //USB AUDIO юЄяры       // [NS]
  990.             {
  991.                 if (MessageBox( wnd, "Sound\nPlay DSERR_NODRIVER CRASH.\nReinit sound?", "Unreal", MB_YESNO | MB_ICONERROR | MB_SETFOREGROUND) == IDYES)
  992.                 {
  993.                     reinit_sound_ds();
  994.                     restore_sound_buffer();
  995.                     //фры№°х ь√ ыютшь
  996.                     //DirectSoundCreate(): 0x88780078, DSERR_NODRIVER
  997.                     return;
  998.                 }
  999.             }
  1000.             //-----------------------------------------------------------------
  1001.             printrds("IDirectSoundBuffer::Play()", r);
  1002.             exit();
  1003.         }
  1004.         //---------------------------------------------------------------------
  1005.         if ((conf.SyncMode == SM_SOUND) && conf.sleepidle)
  1006.         {
  1007.             //printf("sleep %d\n", SLEEP_DELAY);
  1008.             Sleep( SLEEP_DELAY);        // SLEEP_DELAY = 2
  1009.         }
  1010.         //---------------------------------------------------------------------
  1011.     }
  1012.     while (conf.SyncMode == SM_SOUND);  //do while
  1013.     //-------------------------------------------------------------------------
  1014.     dsoffset %= dsbuffer_sz;
  1015.     //-------------------------------------------------------------------------
  1016.     if (!spbsize)
  1017.         return;
  1018.     //-------------------------------------------------------------------------
  1019.     void *ptr1;
  1020.     void *ptr2;
  1021.     DWORD sz1;
  1022.     DWORD sz2;
  1023.     //-------------------------------------------------------------------------
  1024.     r = dsbf->Lock( dsoffset, spbsize, &ptr1, &sz1, &ptr2, &sz2, 0);
  1025.     //-------------------------------------------------------------------------
  1026.     if (r != DS_OK)
  1027.     {
  1028.         //---------------------------------------------------------------------
  1029.         if (r == DSERR_BUFFERLOST)
  1030.         {
  1031.             restore_sound_buffer();
  1032.             return;
  1033.         }
  1034.         //-----------------------------------------------------------------
  1035.         // їч ёЁрсрЄ√трхЄ ыш юэю ЄєЄ
  1036.         if (r == DSERR_NODRIVER)        //USB AUDIO юЄяры       // [NS]
  1037.         {
  1038.                 if (MessageBox( wnd, "Sound\nLock DSERR_NODRIVER CRASH.\nReinit sound?", "Unreal", MB_YESNO | MB_ICONERROR | MB_SETFOREGROUND) == IDYES)
  1039.                 {
  1040.                     reinit_sound_ds();
  1041.                     restore_sound_buffer();
  1042.                     //фры№°х ь√ ыютшь
  1043.                     //DirectSoundCreate(): 0x88780078, DSERR_NODRIVER
  1044.                     return;
  1045.                 }
  1046.         }
  1047.         //-----------------------------------------------------------------
  1048.         // __debugbreak();
  1049.         printf("dsbuffer_sz=%u, dsoffset=%u, spbsize=%u\n", dsbuffer_sz, dsoffset, spbsize);
  1050.         printrds("IDirectSoundBuffer::Lock()", r);
  1051.         exit();
  1052.     }
  1053.     //-------------------------------------------------------------------------
  1054.     memcpy( ptr1, sndplaybuf, sz1);     // 37.503636 (128)
  1055.                                         // 37.681034 (atarin)
  1056.     //-------------------------------------------------------------------------
  1057.     // ъръюх Єю Ёхфъюх  тыхэшх
  1058.     if (ptr2)   // 20.973913 (128)
  1059.     {
  1060.         memcpy( ptr2, ((char *)sndplaybuf) + sz1, sz2); // 26.727273 (atarin)
  1061.     }
  1062.  
  1063.     //-------------------------------------------------------------------------
  1064.     r = dsbf->Unlock( ptr1, sz1, ptr2, sz2);
  1065.     //-------------------------------------------------------------------------
  1066.     if (r != DS_OK)
  1067.     {
  1068.         //---------------------------------------------------------------------
  1069.         if (r == DSERR_BUFFERLOST)
  1070.         {
  1071.             restore_sound_buffer();
  1072.             return;
  1073.         }
  1074.         //-----------------------------------------------------------------
  1075.         // їч ёЁрсрЄ√трхЄ ыш юэю ЄєЄ
  1076.         if (r == DSERR_NODRIVER)        //USB AUDIO юЄяры       // [NS]
  1077.         {
  1078.                 if (MessageBox( wnd, "Sound\nUnlock DSERR_NODRIVER CRASH.\nReinit sound?", "Unreal", MB_YESNO | MB_ICONERROR | MB_SETFOREGROUND) == IDYES)
  1079.                 {
  1080.                     reinit_sound_ds();
  1081.                     restore_sound_buffer();
  1082.                     //фры№°х ь√ ыютшь
  1083.                     //DirectSoundCreate(): 0x88780078, DSERR_NODRIVER
  1084.                     return;
  1085.                 }
  1086.         }
  1087.         //-----------------------------------------------------------------
  1088.         // __debugbreak();
  1089.         printf("dsbuffer_sz=%u, dsoffset=%u, spbsize=%u\n", dsbuffer_sz, dsoffset, spbsize);
  1090.         printrds("IDirectSoundBuffer::Unlock()", r);
  1091.         exit();
  1092.     }
  1093.     //-------------------------------------------------------------------------
  1094.     dsoffset += spbsize;
  1095.     dsoffset %= dsbuffer_sz;
  1096. }
  1097. //=============================================================================
  1098. // directsound part
  1099. // end
  1100. //=============================================================================
  1101.  
  1102.  
  1103.  
  1104.  
  1105.  
  1106. //=============================================================================
  1107.  
  1108. static unsigned OldRflags = 0;
  1109.  
  1110. //=============================================================================
  1111. void sound_play()
  1112. {
  1113. //   printf("%s\n", __FUNCTION__);
  1114.     maxgap = 2000;
  1115.     restart_sound();
  1116. }
  1117. //=============================================================================
  1118.  
  1119.  
  1120. //=============================================================================
  1121. void sound_stop()
  1122. {
  1123. //   printf("%s\n", __FUNCTION__);
  1124. //   __debugbreak();
  1125.     //-------------------------------------------------------------------------
  1126.     if (dsbf)
  1127.     {
  1128.         dsbf->Stop(); // don't check
  1129.         clear_buffer();
  1130.     }
  1131.     //-------------------------------------------------------------------------
  1132. }
  1133. //=============================================================================
  1134.  
  1135.  
  1136. //=============================================================================
  1137. void do_sound()                                
  1138. {                                              
  1139.     //-------------------------------------------------------------------------
  1140.     if (savesndtype == 1)
  1141.     {
  1142.         //---------------------------------------------------------------------
  1143.         if (fwrite( sndplaybuf, 1, spbsize, savesnd) != spbsize)
  1144.         {
  1145.             savesnddialog();    // write error - disk full - close file
  1146.         }
  1147.         //---------------------------------------------------------------------
  1148.     }
  1149.     //-------------------------------------------------------------------------
  1150.    
  1151.         // conf.sound.do_sound = do_sound_wave;
  1152.         // do_sound_none()
  1153.         // do_sound_wave()
  1154.         // do_sound_ds()
  1155.     conf.sound.do_sound();      // 40373.822626 (800 MHz)
  1156.                                 // 61170.809365 (2,5 GHz)
  1157.                        
  1158. }
  1159. //=============================================================================
  1160.  
  1161.  
  1162.  
  1163.  
  1164. //=============================================================================
  1165. void OnEnterGui()
  1166. {
  1167. //      printf("%s->%p\n", __FUNCTION__, D3dDev);
  1168.     //-------------------------------------------------------------------------
  1169.     sound_stop();
  1170.     //-------------------------------------------------------------------------
  1171.     if (conf.gs_type == 2) //GS BASS
  1172.     {
  1173.         gs.pause_mod(); // STOP FCKN BASS NOW!
  1174.                         // ўЄюс эх яш∙ры т ьхэ■°ърї т фхсрухЁх шЄф...
  1175.     }
  1176.     //-------------------------------------------------------------------------
  1177.     // ┬√тюф GUI яЁш ръЄштэюь d3d exclusive Ёхцшьх
  1178.     // эр тЁхь  т√тюфр GUI яхЁхїюф т non exclusive fullscreen
  1179.     if ((temp.rflags & RF_D3DE) && D3dDev)
  1180.     {
  1181.         OldRflags = temp.rflags;
  1182.         SetVideoModeD3d( false);
  1183.         SendMessage( wnd, WM_USER, 0, 0);
  1184.         flip();
  1185.     }
  1186.     //-------------------------------------------------------------------------
  1187. }
  1188. //=============================================================================
  1189.  
  1190.  
  1191. //=============================================================================
  1192. void OnExitGui( bool RestoreVideo)
  1193. {
  1194. //    printf("%s->%p, %d\n", __FUNCTION__, D3dDev, RestoreVideo);
  1195.    
  1196.     //-------------------------------------------------------------------------
  1197.     sound_play();
  1198.     //-------------------------------------------------------------------------
  1199.     if (conf.gs_type == 2) //GS BASS
  1200.     {
  1201.         gs.play_mod();  // PLAY FCKN BASS NOW!  [NS]
  1202.                         // эр т√їюфх шч ьхэ■°хъ
  1203.     }
  1204.     //-------------------------------------------------------------------------
  1205.     if (!RestoreVideo)
  1206.     {
  1207.         return;
  1208.     }
  1209.     //-------------------------------------------------------------------------
  1210.     if (!D3dDev)
  1211.     {
  1212.         return;
  1213.     }
  1214.     //-------------------------------------------------------------------------
  1215.     // ┬ючтЁрЄ шч GUI т d3d exclusive Ёхцшь
  1216.     if ((temp.rflags & RF_D3DE))
  1217.     {
  1218.         SetVideoModeD3d( true);
  1219.     }
  1220.     //-------------------------------------------------------------------------
  1221.     // ╧хЁхъы■ўхэшх RF_D3DE->RF_D3D (т ьхэ■ эрёЄЁюхъ яхЁхъы■ўхэ тшфхюфЁрщтхЁ)
  1222.     if ((OldRflags & RF_D3DE) && (temp.rflags & RF_D3D))
  1223.     {
  1224.         SetVideoModeD3d( false);
  1225.     }
  1226.     //-------------------------------------------------------------------------
  1227. }
  1228. //=============================================================================
  1229.  
  1230.  
  1231.  
  1232.  
  1233. //=============================================================================
  1234. #define STATUS_PRIVILEGE_NOT_HELD        ((NTSTATUS)0xC0000061L)
  1235. #define SE_INC_BASE_PRIORITY_PRIVILEGE      (14L)
  1236. #define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
  1237.  
  1238. typedef NTSTATUS (NTAPI *TRtlAdjustPrivilege)(ULONG Privilege, BOOLEAN Enable, BOOLEAN Client, PBOOLEAN WasEnabled);
  1239.  
  1240. //=============================================================================
  1241. void set_priority()
  1242. {
  1243.     //-------------------------------------------------------------------------
  1244.     if (!conf.highpriority || !conf.sleepidle)
  1245.         return;
  1246.     //-------------------------------------------------------------------------
  1247.     SYSTEM_INFO SysInfo;
  1248.     GetSystemInfo(&SysInfo);
  1249.     ULONG Cpus = SysInfo.dwNumberOfProcessors;
  1250.  
  1251.     ULONG HighestPriorityClass = HIGH_PRIORITY_CLASS;
  1252.     //-------------------------------------------------------------------------
  1253.     if (Cpus > 1) // тшфшью эр 1 яЁюЎх ё ЁшрыЄрщьюь яюычрхЄ тё  ёшёЄхьр
  1254.     {
  1255.         HMODULE NtDll = GetModuleHandle("ntdll.dll");
  1256.         TRtlAdjustPrivilege RtlAdjustPrivilege = (TRtlAdjustPrivilege)GetProcAddress(NtDll, "RtlAdjustPrivilege");
  1257.  
  1258.         BOOLEAN WasEnabled = FALSE;
  1259.         NTSTATUS Status = RtlAdjustPrivilege(SE_INC_BASE_PRIORITY_PRIVILEGE, TRUE, FALSE, &WasEnabled);
  1260.         //---------------------------------------------------------------------
  1261.         if (!NT_SUCCESS(Status))
  1262.         {
  1263.             err_printf("enabling SE_INC_BASE_PRIORITY_PRIVILEGE, %X", Status);
  1264.             //---------------------------------------------------------------------
  1265.             if (Status == STATUS_PRIVILEGE_NOT_HELD)
  1266.             {
  1267.                 err_printf("program not run as administrator or SE_INC_BASE_PRIORITY_PRIVILEGE is not enabled via group policy");
  1268.             }
  1269.             //---------------------------------------------------------------------
  1270.             printf("REALTIME_PRIORITY_CLASS not available, fallback to HIGH_PRIORITY_CLASS\n");
  1271.         }
  1272.         //---------------------------------------------------------------------
  1273.         else
  1274.         {
  1275.             HighestPriorityClass = REALTIME_PRIORITY_CLASS;
  1276.         }
  1277.         //---------------------------------------------------------------------
  1278.     }
  1279.     //-------------------------------------------------------------------------
  1280.     SetPriorityClass(GetCurrentProcess(), HighestPriorityClass);
  1281.     SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
  1282. }
  1283. //=============================================================================
  1284.  
  1285.  
  1286. //=============================================================================
  1287. void adjust_mouse_cursor()      // °шЄю юэю фхыршЄ? ю_╬
  1288. {                               // ьюцхЄ юэю эх фрхЄ т√хїрЄ№ ъєЁёюЁє чр яЁхфхы√ ¤ъЁрэр?
  1289.  
  1290. //  printf("adjust_mouse_cursor()\n");
  1291. //  unsigned showcurs = conf.input.joymouse || !active || !(conf.fullscr || conf.lockmouse) || dbgbreak;
  1292.     unsigned showcurs = conf.input.joymouse || !active || !(conf.lockmouse) || dbgbreak; // [NS] юЄюсЁрцрЄ№ ь√°є т ЇєыёъЁшэх
  1293.     //-------------------------------------------------------------------------
  1294.     while (ShowCursor(0) >= 0);                 // hide cursor
  1295.     //-------------------------------------------------------------------------
  1296.     if (showcurs)
  1297.         while (ShowCursor(1) <= 0);             // show cursor
  1298.     //-------------------------------------------------------------------------
  1299.     if (active && conf.lockmouse && !dbgbreak)
  1300.     {
  1301.         RECT rc;
  1302.         GetClientRect(wnd, &rc);
  1303.         POINT p =
  1304.         {
  1305.             rc.left,
  1306.             rc.top
  1307.         };
  1308.         ClientToScreen(wnd, &p);
  1309.         rc.left = p.x;
  1310.         rc.top = p.y;
  1311.         p.x = rc.right;
  1312.         p.y = rc.bottom;
  1313.         ClientToScreen(wnd, &p);
  1314.         rc.right = p.x;
  1315.         rc.bottom = p.y;
  1316.         // printf("rc={%d,%d,%d,%d} [%dx%d]\n", rc.left, rc.top, rc.right, rc.bottom, rc.right - rc.left, rc.bottom - rc.top);
  1317.         ClipCursor(&rc);
  1318.     }
  1319.     //-------------------------------------------------------------------------
  1320.     else
  1321.     {
  1322.         ClipCursor(nullptr);
  1323.     }
  1324.     //-------------------------------------------------------------------------
  1325.  
  1326. }
  1327. //=============================================================================
  1328.  
  1329. static HCURSOR crs[9];
  1330. static unsigned char mousedirs[9] = { 10, 8, 9, 2, 0, 1, 6, 4, 5 };
  1331.  
  1332. //=============================================================================
  1333.  
  1334.  
  1335.  
  1336.  
  1337. //=============================================================================
  1338. void updatebitmap()
  1339. {
  1340.     RECT rc;
  1341.     GetClientRect(wnd, &rc);
  1342.     DWORD newdx = DWORD(rc.right - rc.left);
  1343.     DWORD newdy = DWORD(rc.bottom - rc.top);
  1344.    
  1345.     //-------------------------------------------------------------------------
  1346.     if (hbm && (bm_dx != newdx || bm_dy != newdy))
  1347.     {
  1348.         DeleteObject(hbm);
  1349.         hbm = nullptr;
  1350.     }
  1351.     //-------------------------------------------------------------------------
  1352.     if (sprim)
  1353.         return; // don't trace window contents in overlay mode
  1354.     //-------------------------------------------------------------------------
  1355.     if (hbm)
  1356.     {
  1357.         DeleteObject(hbm);
  1358.         hbm = nullptr; // keeping bitmap is unsafe - screen paramaters may change
  1359.     }
  1360.     //-------------------------------------------------------------------------
  1361.     if (!hbm)
  1362.     {
  1363.         hbm = CreateCompatibleBitmap(   temp.gdidc,
  1364.                                         int(newdx),
  1365.                                         int(newdy)
  1366.                                      );
  1367.     }
  1368.     //-------------------------------------------------------------------------
  1369.     HDC dc = CreateCompatibleDC(temp.gdidc);
  1370.  
  1371.     bm_dx = newdx;
  1372.     bm_dy = newdy;
  1373.     HGDIOBJ PrevObj = SelectObject(dc, hbm);
  1374.     //SetDIBColorTable(dc, 0, 0x100, (RGBQUAD*)pal0);
  1375.    
  1376.     //printf("XX ");
  1377.    
  1378.     // ёюїЁрэхэшх шчюсЁрцхэш  эр ¤ъЁрэх
  1379.     // ўЄюс яюЄюь шь тюёЄрэртыштрЄ№ шчюсЁрцхэшшх яюф юъэюрьш
  1380.     // ═╬ ╬═╬ ╙╤╥└╨┼┬└┼╥ ╙╞┼ ╫┼╨┼╟ ╘╨┼╔╠
  1381.     // ╚ ╧╬╥╬╠ ╠╚├└┼╥ ╩└└╩╬╔ ╥╬ ╒╙╔═┼╔ ╩╬╥╬╨╬╔ ─└┬═╬ ═└ ▌╩╨╨└═┼ ═┼╥!!!
  1382.     // ╥└╩ ╞┼ ╫└╤╥╬ ╬═╬ ╤╬╒╨└═▀┼╥ ╤╬┬┼╨╪┼══╬ ═┼┬└╦╚─═╬┼ ╚╟╬┴╨└╞┼═╚┼ !!!
  1383.     // ╤ ╩╙╤╩└╠╚ ╫╙╞╚╒ ╬╩╬═
  1384.    
  1385. //    BitBlt(   dc,
  1386. //              0,
  1387. //              0,
  1388. //              int(newdx),
  1389. //              int(newdy),
  1390. //              temp.gdidc,
  1391. //              0,
  1392. //              0,
  1393. //              SRCCOPY
  1394. //        );
  1395.          
  1396.     SelectObject( dc, PrevObj);
  1397.     DeleteDC( dc);
  1398. }
  1399. //=============================================================================
  1400.  
  1401.  
  1402. /*
  1403.  movesize.c
  1404.  These values are indexes that represent rect sides. These indexes are
  1405.  used as indexes into rgimpiwx and rgimpiwy (which are indexes into the
  1406.  the rect structure) which tell the move code where to store the new x & y
  1407.  coordinates. Notice that when two of these values that represent sides
  1408.  are added together, we get a unique list of contiguous values starting at
  1409.  1 that represent all the ways we can size a rect. That also leaves 0 free
  1410.  a initialization value.
  1411.  
  1412.  The reason we need rgimpimpiw is for the keyboard interface - we
  1413.  incrementally decide what our 'move command' is. With the mouse interface
  1414.  we know immediately because we registered a mouse hit on the segment(s)
  1415.  we're moving.
  1416.  
  1417.      4           5
  1418.       \ ___3___ /
  1419.        |       |
  1420.        1       2
  1421.        |_______|
  1422.       /    6    \
  1423.      7           8
  1424. */
  1425.  
  1426. //static const int rgimpimpiw[] = {1, 3, 2, 6};
  1427. //=============================================================================
  1428. static const int rgimpiwx[] =
  1429. {
  1430.      0, // WMSZ_KEYSIZE
  1431.      0, // WMSZ_LEFT
  1432.      2, // WMSZ_RIGHT
  1433.     -1, // WMSZ_TOP
  1434.      0, // WMSZ_TOPLEFT
  1435.      2, // WMSZ_TOPRIGHT
  1436.     -1, // WMSZ_BOTTOM
  1437.      0, // WMSZ_BOTTOMLEFT
  1438.      2, // WMSZ_BOTTOMRIGHT
  1439.      0  // WMSZ_KEYMOVE
  1440. };
  1441. //=============================================================================
  1442. static const int rgimpiwy[]   = {0, -1, -1,  1, 1, 1,  3, 3, 3, 1};
  1443. //=============================================================================
  1444. #define WMSZ_KEYSIZE        0           // ;Internal
  1445. #define WMSZ_LEFT           1
  1446. #define WMSZ_RIGHT          2
  1447. #define WMSZ_TOP            3
  1448. #define WMSZ_TOPLEFT        4
  1449. #define WMSZ_TOPRIGHT       5
  1450. #define WMSZ_BOTTOM         6
  1451. #define WMSZ_BOTTOMLEFT     7
  1452. #define WMSZ_BOTTOMRIGHT    8
  1453. #define WMSZ_MOVE           9           // ;Internal
  1454. #define WMSZ_KEYMOVE        10          // ;Internal
  1455. #define WMSZ_SIZEFIRST      WMSZ_LEFT   // ;Internal
  1456. //=============================================================================
  1457. struct MOVESIZEDATA
  1458. {
  1459.     RECT rcDragCursor;
  1460.     POINT ptMinTrack;
  1461.     POINT ptMaxTrack;
  1462.     int cmd;
  1463. };
  1464. //=============================================================================
  1465.  
  1466.  
  1467. //=============================================================================
  1468. static void SizeRectX(MOVESIZEDATA *Msd, ULONG Pt)
  1469. {
  1470.     PINT psideDragCursor = ((PINT)(&Msd->rcDragCursor));
  1471.  
  1472. //  * DO HORIZONTAL
  1473.  
  1474. //  * We know what part of the rect we're moving based on
  1475. //  * what's in cmd.  We use cmd as an index into rgimpiw? which
  1476. //  * tells us what part of the rect we're dragging.
  1477.  
  1478. //  * Get the approriate array entry.
  1479.  
  1480.     int index = (int)rgimpiwx[Msd->cmd];   // AX
  1481.    
  1482. //    printf("Msd.cmd = %d, idx_x=%d\n", Msd->cmd, index);
  1483.  
  1484. //  * Is it one of the entries we don't map (i.e.  -1)?
  1485.  
  1486.     //-------------------------------------------------------------------------
  1487.     if (index < 0)
  1488.         return;
  1489.     //-------------------------------------------------------------------------
  1490.     psideDragCursor[index] = GET_X_LPARAM(Pt);
  1491.  
  1492.     int indexOpp = index ^ 0x2;
  1493.  
  1494. //  * Now check to see if we're below the min or above the max. Get the width
  1495. //  * of the rect in this direction (either x or y) and see if it's bad. If
  1496. //  * so, map the side we're moving to the min or max.
  1497.  
  1498.     int w = psideDragCursor[index] - psideDragCursor[indexOpp];
  1499.     //-------------------------------------------------------------------------
  1500.     if (indexOpp & 0x2)
  1501.     {
  1502.         w = -w;
  1503.     }
  1504.     //-------------------------------------------------------------------------
  1505.     int x;
  1506.     //-------------------------------------------------------------------------
  1507.     if (w < Msd->ptMinTrack.x)
  1508.     {
  1509.         x = Msd->ptMinTrack.x;
  1510.     }
  1511.     //-------------------------------------------------------------------------
  1512.     else if (w > Msd->ptMaxTrack.x)
  1513.     {
  1514.         x = Msd->ptMaxTrack.x;
  1515.     }
  1516.     //-------------------------------------------------------------------------
  1517.     else
  1518.     {
  1519.         return;
  1520.     }
  1521.     //-------------------------------------------------------------------------
  1522.     if (indexOpp & 0x2)
  1523.     {
  1524.         x = -x;
  1525.     }
  1526.     //-------------------------------------------------------------------------
  1527.     psideDragCursor[index] = x + psideDragCursor[indexOpp];
  1528. }
  1529. //=============================================================================
  1530.  
  1531.  
  1532. //=============================================================================
  1533. static void SizeRectY(MOVESIZEDATA *Msd, ULONG Pt)
  1534. {
  1535.     PINT psideDragCursor = ((PINT)(&Msd->rcDragCursor));
  1536.  
  1537. //  * DO VERTICAL
  1538.  
  1539. //  * We know what part of the rect we're moving based on
  1540. //  * what's in cmd.  We use cmd as an index into rgimpiw? which
  1541. //  * tells us what part of the rect we're dragging.
  1542.  
  1543. //  * Get the approriate array entry.
  1544.  
  1545.     int index = (int)rgimpiwy[Msd->cmd];   // AX
  1546.  
  1547. //    printf("idx_y=%d\n", index);
  1548.  
  1549. //  * Is it one of the entries we don't map (i.e.  -1)?
  1550.  
  1551.     //-------------------------------------------------------------------------
  1552.     if (index < 0)
  1553.         return;
  1554.     //-------------------------------------------------------------------------
  1555.     psideDragCursor[index] = GET_Y_LPARAM(Pt);
  1556.  
  1557.     int indexOpp = index ^ 0x2;
  1558.  
  1559. //  * Now check to see if we're below the min or above the max. Get the width
  1560. //  * of the rect in this direction (either x or y) and see if it's bad. If
  1561. //  * so, map the side we're moving to the min or max.
  1562.  
  1563.     int h = psideDragCursor[index] - psideDragCursor[indexOpp];
  1564.     //-------------------------------------------------------------------------
  1565.     if (indexOpp & 0x2)
  1566.     {
  1567.         h = -h;
  1568.     }
  1569.     //-------------------------------------------------------------------------
  1570.     int y;
  1571.     if (h < Msd->ptMinTrack.y)
  1572.     {
  1573.         y = Msd->ptMinTrack.y;
  1574.     }
  1575.     //-------------------------------------------------------------------------
  1576.     else if (h > Msd->ptMaxTrack.y)
  1577.     {
  1578.         y  = Msd->ptMaxTrack.y;
  1579.     }
  1580.     //-------------------------------------------------------------------------
  1581.     else
  1582.     {
  1583.         return;
  1584.     }
  1585.     //-------------------------------------------------------------------------
  1586.     if (indexOpp & 0x2)
  1587.     {
  1588.         y = -y;
  1589.     }
  1590.     //-------------------------------------------------------------------------
  1591.     psideDragCursor[index] = y + psideDragCursor[indexOpp];
  1592. }
  1593. //=============================================================================
  1594.  
  1595.  
  1596. //=============================================================================
  1597. static void SizeRect(MOVESIZEDATA *Msd, ULONG Pt)
  1598. {
  1599.     //-------------------------------------------------------------------------
  1600.     if (size_t(Msd->cmd) >= _countof(rgimpiwx))
  1601.     {
  1602.         return;
  1603.     }
  1604.     //-------------------------------------------------------------------------
  1605.     SizeRectX(Msd, Pt);
  1606.     SizeRectY(Msd, Pt);
  1607. }
  1608. //=============================================================================
  1609.  
  1610.  
  1611.  
  1612.  
  1613.  
  1614. //=============================================================================
  1615. // юсЁрсюЄўшъ ёюс√Єшщ
  1616. //=============================================================================
  1617. static LRESULT CALLBACK WndProc(        HWND hwnd,
  1618.                                         UINT uMessage,
  1619.                                         WPARAM wparam,
  1620.                                         LPARAM lparam
  1621.           )
  1622. //-----------------------------------------------------------------------------
  1623. {
  1624.     //-------------------------------------------------------------------------
  1625.     // ╠юфшЇшърЎш  яєэъЄют уыртэюую ьхэ■ ш ъюэЄхъёэюую ьхэ■ уыртэюую юъэр
  1626.     if (uMessage == WM_INITMENU)
  1627.     {
  1628.         // яю їюфє ь√ эх ьюцхь юЄышўшЄ№ уыртэюх ьхэ■ юЄ ъюэЄхъёэюую
  1629.         // яюЄюьє ьхэ хь юср
  1630.  
  1631.                 if (wparam == (WPARAM)main_menu)        // Єръ є TSL
  1632.                 {                                       // яєёЄ№ сєфхЄ Єюцх
  1633.                         //-----------------------------------------------------
  1634.                         // File
  1635.                         //-----------------------------------------------------
  1636.                         EnableMenuItem( main_menu,
  1637.                                         IDM_SAVE_DISKB,
  1638.                                 //      (comp.wd.fdd[1].rawdata in TSL unreal
  1639.                                         (comp.fdd[1].rawdata  ?  MF_ENABLED:
  1640.                                                                  MF_GRAYED | MF_DISABLED)
  1641.                                 );
  1642.                         //-----------------------------------------------------
  1643.                         EnableMenuItem( main_menu,
  1644.                                         IDM_SAVE_DISKC,
  1645.                                 //      (comp.wd.fdd[2].rawdata in TSL unreal
  1646.                                         (comp.fdd[2].rawdata  ?  MF_ENABLED:
  1647.                                                                  MF_GRAYED | MF_DISABLED)
  1648.                                 );
  1649.                         //-----------------------------------------------------
  1650.                         EnableMenuItem( main_menu,
  1651.                                         IDM_SAVE_DISKD,
  1652.                                 //      (comp.wd.fdd[3].rawdata in TSL unreal
  1653.                                         (comp.fdd[3].rawdata  ?  MF_ENABLED:
  1654.                                                                  MF_GRAYED | MF_DISABLED)
  1655.                                 );     
  1656.                         //-----------------------------------------------------
  1657.                         ModifyMenu(     main_menu,
  1658.                                         IDM_AUDIOREC,
  1659.                                         MF_BYCOMMAND,
  1660.                                         IDM_AUDIOREC,
  1661.                                         savesndtype  ?  "Stop Audio Recording":
  1662.                                                         "Start Audio Recording"
  1663.                                 );
  1664.                         //-----------------------------------------------------
  1665.                         // Emulation
  1666.                         //-----------------------------------------------------
  1667.                         CheckMenuItem(  main_menu,
  1668.                                         IDM_PAUSE,
  1669.                                         (main_pause_flag  ?  MF_CHECKED:
  1670.                                                              MF_UNCHECKED)
  1671.                                 );
  1672.                         //-----------------------------------------------------
  1673.                         CheckMenuItem(  main_menu,
  1674.                                         IDM_MAXIMUMSPEED,
  1675.                                         (conf.sound.enabled  ?  MF_UNCHECKED:
  1676.                                                                 MF_CHECKED)
  1677.                                 );
  1678.                         //-----------------------------------------------------
  1679.                         ModifyMenu(     main_menu,
  1680.                                         IDM_TAPE_CONTROL,
  1681.                                         (tape_infosize  ?  MF_ENABLED:
  1682.                                                            MF_GRAYED | MF_DISABLED),
  1683.                                         IDM_TAPE_CONTROL,
  1684.                                         comp.tape.play_pointer  ?  "Stop Tape":
  1685.                                                                    "Start Tape"
  1686.                                 );     
  1687.                         //-----------------------------------------------------
  1688.                         CheckMenuItem(  main_menu,
  1689.                                         IDM_USETAPETRAPS,
  1690.                                         (conf.tape_traps  ?  MF_CHECKED:
  1691.                                                              MF_UNCHECKED)
  1692.                                 );
  1693.                         //-----------------------------------------------------
  1694.                         CheckMenuItem(  main_menu,
  1695.                                         IDM_AUTOSTARTTAPE,
  1696.                                         (conf.tape_autostart  ?  MF_CHECKED:
  1697.                                                                  MF_UNCHECKED)
  1698.                                 );
  1699.                         //-----------------------------------------------------
  1700.                         // View
  1701.                         //-----------------------------------------------------
  1702.                         CheckMenuItem(  main_menu,
  1703.                                         IDM_FULLSCREEN,
  1704.                                         (conf.fullscr  ?  MF_CHECKED :
  1705.                                                           MF_UNCHECKED)
  1706.                                 );
  1707.                         //-----------------------------------------------------
  1708.                         CheckMenuItem(  main_menu,
  1709.                                         IDM_SCALE1,
  1710.                                         ((temp.scale == 1)  ?  MF_CHECKED :
  1711.                                                                MF_UNCHECKED)
  1712.                                 );
  1713.                         CheckMenuItem(  main_menu,
  1714.                                         IDM_SCALE2,
  1715.                                         ((temp.scale == 2)  ?  MF_CHECKED :
  1716.                                                                MF_UNCHECKED)
  1717.                                 );
  1718.                         CheckMenuItem(  main_menu,
  1719.                                         IDM_SCALE3,
  1720.                                         ((temp.scale == 3)  ?  MF_CHECKED :
  1721.                                                                MF_UNCHECKED)
  1722.                                 );
  1723.                         CheckMenuItem(  main_menu,
  1724.                                         IDM_SCALE4,
  1725.                                         ((temp.scale == 4)  ?  MF_CHECKED :
  1726.                                                                MF_UNCHECKED)
  1727.                                 );
  1728.                         //-----------------------------------------------------
  1729.                         // Input
  1730.                         //-----------------------------------------------------
  1731.                         CheckMenuItem(  main_menu,
  1732.                                         IDM_KEYSTICK,
  1733.                                         ((input.keymode == K_INPUT::KM_KEYSTICK)  ?  MF_CHECKED :
  1734.                                                                                      MF_UNCHECKED)
  1735.                                 );
  1736.                         //-----------------------------------------------------
  1737.                         CheckMenuItem(  main_menu,
  1738.                                         IDM_FULL_XT_KEYBOARD,
  1739.                                         (conf.atm.xt_kbd  ?  MF_CHECKED :
  1740.                                                              MF_UNCHECKED)
  1741.                                 );
  1742.                         //-----------------------------------------------------
  1743.                         // Debug
  1744.                         //-----------------------------------------------------
  1745.                         // int temp_memband_on =     (*(&conf.led.ay + 6) & 0x80000000);        // ╩╬╤╥█╦▄ !!!!
  1746.                         // int temp_memband_256_on = (*(&conf.led.ay + 7) & 0x80000000);        // ╩╬╤╥█╦▄ !!!!
  1747.                         int temp_memband_on =     (conf.led.memband     & 0x80000000);
  1748.                         int temp_memband_256_on = (conf.led.memband_256 & 0x80000000);
  1749.                                                        
  1750.                         CheckMenuItem(  main_menu,             
  1751.                                         IDM_MEMORY_BAND,
  1752.                                         (temp_memband_on  ?  MF_CHECKED :
  1753.                                                              MF_UNCHECKED)
  1754.                                 );     
  1755.                         CheckMenuItem(  main_menu,
  1756.                                         IDM_MEMORY_BAND_1,
  1757.                                         ((conf.led.bandBpp == 512)  ?  (temp_memband_on)  ?  MF_CHECKED :
  1758.                                                                                              MF_UNCHECKED:
  1759.                                                                        MF_UNCHECKED)
  1760.                                 );
  1761.                         CheckMenuItem(  main_menu,
  1762.                                         IDM_MEMORY_BAND_2,
  1763.                                         ((conf.led.bandBpp == 256)  ?  (temp_memband_on)  ?  MF_CHECKED :
  1764.                                                                                              MF_UNCHECKED:
  1765.                                                                        MF_UNCHECKED)
  1766.                                 );
  1767.                         CheckMenuItem(  main_menu,
  1768.                                         IDM_MEMORY_BAND_4,
  1769.                                         ((conf.led.bandBpp == 128)  ?  (temp_memband_on)  ?  MF_CHECKED :
  1770.                                                                                              MF_UNCHECKED:
  1771.                                                                        MF_UNCHECKED)
  1772.                                 );
  1773.                         CheckMenuItem(  main_menu,
  1774.                                         IDM_MEMORY_BAND_8,
  1775.                                         ((conf.led.bandBpp == 64)  ?  (temp_memband_on)  ?  MF_CHECKED :
  1776.                                                                                             MF_UNCHECKED:
  1777.                                                                        MF_UNCHECKED)
  1778.                                 );
  1779.                         //-----------------------------------------------------
  1780.                         CheckMenuItem(  main_menu,              // ╩╬╤╥█╦▄ !!!!
  1781.                                         IDM_MEMORY_BAND_256,
  1782.                                         (temp_memband_256_on  ?  MF_CHECKED :
  1783.                                                                  MF_UNCHECKED)
  1784.                                 );
  1785.                         CheckMenuItem(  main_menu,              // ╩╬╤╥█╦▄ !!!!
  1786.                                         IDM_MEMORY_BAND_256_256PPL,
  1787.                                         (temp_memband_256_on  ?  MF_CHECKED :
  1788.                                                                  MF_UNCHECKED)
  1789.                                 );
  1790.                         //-----------------------------------------------------
  1791.  
  1792.                
  1793.                
  1794.                
  1795.                         //-----------------------------------------------------
  1796.                         HMENU sys = GetSystemMenu(      wnd,
  1797.                                                         FALSE   //0
  1798.                                                     );  
  1799.                         //-----------------------------------------------------
  1800.                         if (sys)
  1801.                         {
  1802.                             CheckMenuItem(      sys,
  1803.                                                 SCU_SCALE1,
  1804.                                                 ((temp.scale == 1)  ?  MF_CHECKED :
  1805.                                                                        MF_UNCHECKED)
  1806.                                         );
  1807.                             CheckMenuItem(      sys,
  1808.                                                 SCU_SCALE2,
  1809.                                                 ((temp.scale == 2)  ?  MF_CHECKED :
  1810.                                                                        MF_UNCHECKED)
  1811.                                         );
  1812.                             CheckMenuItem(      sys,
  1813.                                                 SCU_SCALE3,
  1814.                                                 ((temp.scale == 3)  ?  MF_CHECKED :
  1815.                                                                        MF_UNCHECKED)
  1816.                                         );
  1817.                             CheckMenuItem(      sys,
  1818.                                                 SCU_SCALE4,
  1819.                                                 ((temp.scale == 4)  ?  MF_CHECKED :
  1820.                                                                        MF_UNCHECKED)
  1821.                                         );
  1822.                         }
  1823.                         //-----------------------------------------------------
  1824.                        
  1825.                        
  1826.                 }
  1827.     }
  1828.     //-------------------------------------------------------------------------
  1829.     if (uMessage == WM_QUIT) // never heppens
  1830.     {
  1831. //      __debugbreak();
  1832. //      printf("WM_QUIT\n");
  1833.         exit();
  1834.     }
  1835. //-----------------------------------------------------------------------------  
  1836. //        WM_SYNCPAINT
  1837. //        WM_NCPAINT
  1838. //        WM_ERASEBKGND
  1839. //        WM_SYNCPAINT
  1840. //        WM_NCPAINT            //Ёшёютрэшх чруюыютър юъэр ш ьхэ■°хъ
  1841. //        WM_ERASEBKGND         //ёЄшЁррэшх Їюэр
  1842. //        WM_SYNCPAINT          //їч
  1843. //        WM_NCPAINT
  1844. //        WM_PAINT
  1845.  
  1846.     //-------------------------------------------------------------------------
  1847. //    if (uMessage == WM_SYNCPAINT)     //NS test
  1848. //    {                                 //эхЄ юяшёрэш  ўЄю ¤Єю
  1849. //      //printf("WM_SYNCPAINT ");
  1850. //      return 0;
  1851. //    }
  1852.     //-------------------------------------------------------------------------
  1853.     // юўшёЄър яЁш т√Є уштрэшш юъэр шччр уЁрэшЎ√ ¤ъЁрэр
  1854.     // ш т main window ш т фхсрухЁх
  1855.     // ═╬ эх яЁш Є урэшш юъюэ яютхЁї
  1856.     //          ёЄрэфрЁЄэ√щ юсЁрсюЄўшъ ЁшёєхЄ їхЁэ■ яютхЁї
  1857.     //          яЁш т√Є уштрэшш юъэр шччр уЁрэшЎ√ ¤ъЁрэр
  1858.     if (uMessage == WM_ERASEBKGND)                                      // [NS]
  1859.     {
  1860.         //printf("WM_ERASEBKGND ");
  1861.         return 0;
  1862.     }
  1863.     //-------------------------------------------------------------------------
  1864.     if (uMessage == WM_CLOSE)   // never heppens
  1865.     {
  1866. //      __debugbreak();
  1867.         printf("WM_CLOSE\n");
  1868.         return 1;
  1869.     }
  1870.     //-------------------------------------------------------------------------
  1871. //#if 1
  1872.     if ((uMessage == WM_SETFOCUS) && (!pause))
  1873.     {
  1874.         active = 1;
  1875.         setpal(0);
  1876. //      sound_play();
  1877.         adjust_mouse_cursor();
  1878.         uMessage = WM_USER;
  1879.     }
  1880.     //-------------------------------------------------------------------------
  1881.     if ((uMessage == WM_KILLFOCUS) && (!pause))
  1882.     {
  1883.         //---------------------------------------------------------------------
  1884.         if (dd)
  1885.             dd->FlipToGDISurface();
  1886.         //---------------------------------------------------------------------
  1887.         updatebitmap();         // ёюїЁрэхэшх Єхъє∙хую шчюсЁрцхэш  юъэр
  1888.                                 // ╫└╤╥╬ эхтрышфэюую
  1889.                                 // фы  тюёЄрэютыхэш  яюф юъэрьш
  1890.                                 // т√яшышЄ№ эрї !!!!
  1891.         setpal(1);
  1892.         active = 0;
  1893. //      sound_stop();
  1894.         conf.lockmouse = 0;
  1895.         adjust_mouse_cursor();
  1896.     }
  1897.     //-------------------------------------------------------------------------
  1898.     if (uMessage == WM_SIZING)
  1899.     {
  1900. //      printf("WM_SIZING(0x%X)\n", uMessage);
  1901.         return TRUE;
  1902.     }
  1903.     //-------------------------------------------------------------------------
  1904.     static bool Captured = false;
  1905.     static int x = 0;
  1906.     static int y = 0;
  1907.     static ULONG Mode;
  1908.     static MOVESIZEDATA Msd;
  1909.    
  1910.     static bool maximazed_window_mode = false;  // [NS]
  1911.      
  1912. /*
  1913.        WM_NCHITTEST
  1914.        WM_SETCURSOR
  1915.        WM_MOUSEMOVE    WM_MOUSEFIRST
  1916.        WM_NCHITTEST
  1917.        WM_SETCURSOR
  1918.        WM_MOUSEMOVE    WM_MOUSEFIRST
  1919.        WM_NCHITTEST
  1920.        WM_SETCURSOR
  1921.        
  1922.        WM_LBUTTONDOWN
  1923.        WM_NCHITTEST
  1924.        WM_SETCURSOR
  1925.        WM_LBUTTONUP
  1926.        
  1927.        WM_NCHITTEST
  1928.        WM_SETCURSOR
  1929.        WM_MOUSEMOVE    WM_MOUSEFIRST
  1930.        WM_NCACTIVATE
  1931.        WM_ACTIVATE
  1932.        WM_ACTIVATEAPP
  1933.        WM_ACTIVATEAPP
  1934.        WM_KILLFOCUS
  1935. efault iMsg 281 (641)
  1936. */  
  1937.  
  1938.  
  1939. /*
  1940.  
  1941.        WM_NCLBUTTONDOWN
  1942.        WM_SYSCOMMAND
  1943.        WM_ENTERMENULOOP
  1944.        WM_SETCURSOR
  1945.        WM_INITMENU
  1946.        WM_CAPTURECHANGED
  1947.        WM_MENUSELECT
  1948.        WM_EXITMENULOOP
  1949.        WM_NCHITTEST
  1950.        WM_NCHITTEST
  1951.        WM_NCHITTEST
  1952.        WM_NCHITTEST
  1953.        WM_SETCURSOR
  1954.        WM_NCLBUTTONUP
  1955.      
  1956.        WM_NCMOUSEMOVE
  1957.        
  1958. */
  1959.        
  1960.     // фы  фхЄхъЎшш ЁрчтхЁЄ√трэш  юъэр
  1961.     // яхЁхфхырЄ№ !!!
  1962.     // эєцэю юяЁхфхы Є№ фЁєушьш ёЁхфёЄтрьш!!!!
  1963.     //-------------------------------------------------------------------------
  1964.     if ((uMessage == WM_SIZE) && (wparam == SIZEFULLSCREEN))    // [NS]
  1965.     {
  1966.         //printf("fullscreen\n");
  1967.         maximazed_window_mode = TRUE;
  1968.     }
  1969.     //-------------------------------------------------------------------------
  1970.     if ((uMessage == WM_SIZE) && (wparam == SIZENORMAL))        // [NS]
  1971.     {
  1972.         //printf("fullscreen EXIT\n");
  1973.         maximazed_window_mode = FALSE;
  1974.     }
  1975.     //-------------------------------------------------------------------------
  1976.     // яхЁхЄ уштрэшх юъэр чр ы■сє■ хую ўрёЄ№                            [NS]
  1977.     // ёфхырэю ьхЄюфюь эрєўэюую Є√ър
  1978.     //
  1979.     if ( (!maximazed_window_mode)       &&      // ═┼╦▄╟▀ ╥▀═╙╥▄ ╨└╟┬┼╨═╙╥╬┼ ╬╩═╬!!!
  1980.          (!conf.fullscr)                &&      // ш т ЇєыыёъЁшэх
  1981.          (!conf.lockmouse)              &&      // ш ъюуфр ь√°р чрїтрўхэр
  1982.          (conf.All_Screen_Drag)
  1983.       )        
  1984.     {                                                          
  1985.         //---------------------------------------------------------------------
  1986.         if (uMessage == WM_LBUTTONDOWN)
  1987.         {                              
  1988.             //printf("WM_LBUTTONDOWN\n");
  1989.             POINT p =
  1990.             {
  1991.                 GET_X_LPARAM(lparam),
  1992.                 GET_Y_LPARAM(lparam)
  1993.             };
  1994.             ClientToScreen(hwnd, &p);
  1995.             x = p.x;
  1996.             y = p.y;
  1997.             Mode = SC_MOVE;
  1998.             SetCapture(hwnd);
  1999.             Captured = true;
  2000.         }
  2001.         //---------------------------------------------------------------------
  2002.  
  2003. /*      if (uMessage == WM_NCLBUTTONDOWN)       // Єръ ьюцэю ЄръёрЄ№ ш чр ьхэ■°ъє
  2004.         {                                       // ═╬ эєцэр фюяюыэшЄхы№эр  яЁютхЁър
  2005.             //printf("WM_NCLBUTTONDOWN\n");     // р эх Єъэєыш ыш ь√ т "ъэюяъє" ьхэ■°ъш
  2006.             POINT p =                   // шэрўх ьхэ■°ър эхЁрсюЄрхЄ !!!
  2007.             {
  2008.                 GET_X_LPARAM(lparam),
  2009.                 GET_Y_LPARAM(lparam)
  2010.             };
  2011.             //ClientToScreen(hwnd, &p);
  2012.             x = p.x;
  2013.             y = p.y;
  2014.             Mode = SC_MOVE;
  2015.             SetCapture(hwnd);
  2016.             Captured = true;
  2017.             //return DefWindowProc(hwnd, uMessage, wparam, lparam);
  2018.         }
  2019. */
  2020.  
  2021.     }
  2022.     //-------------------------------------------------------------------------
  2023.     if ((
  2024.             (uMessage == WM_LBUTTONUP)  ||
  2025.             (uMessage == WM_NCLBUTTONUP)        // [NS]
  2026.         )
  2027.         &&
  2028.         Captured
  2029.       )
  2030.     {
  2031. //      printf("WM_LBUTTONUP(0x%X)\n", uMessage);
  2032.         Captured = false;
  2033.         ReleaseCapture();
  2034.         return 0;
  2035.     }
  2036. //-----------------------------------------------------------------------------
  2037. // debug deflicker                      //ьхЁчёър  ьшурыър с√ыр т gdi_frame()
  2038.                                         //хёыш юэю т√яшышЄ№ Єю ш ЄєЄ ъюёЄ√ыш эх эрфр
  2039. /*
  2040.    if(uMessage == WM_WINDOWPOSCHANGED)          //NS
  2041.    {
  2042.         if (dbgbreak)                   // ╩╨╚┬╬╔ ╩╬╤╥█╦▄ !
  2043.         {                               // т Ёхцшьх фхсрухЁр Єє°шЄ ьшурыъє
  2044.             needclr = 1;                // ъюЄюЁє■ тшфшью эх тшфэю т win15?
  2045.             return 0;                   // ═╬ ёфхырэю ьхЄюфюь эрєўэюую Є√ър...
  2046.         }                               // ш їч ўхую тююс∙х яЁюшёїюфшЄ
  2047.    }                                    // эю Єъ "є ьхэ  ЁрсюЄрхЄ" Єю ЄЁшцф√ яюї
  2048.   */
  2049. //-----------------------------------------------------------------------------
  2050. // х∙х трЁшрэЄ фы  яюфртыхэш  ьшурыюъ?
  2051. // эю ъръ Єю эєцэю чряюыэшЄ№ ёЄЁєъЄєЁє? WINDOWPOS
  2052. // р шэЄхЁэхЄют яюф Ёєъющ эхЄє
  2053. //
  2054. //if (uMessage == WM_WINDOWPOSCHANGING)
  2055. //   {
  2056. //   //WINDOWPOS.flags |= SWP_NOCOPYBITS;
  2057. //   return 0;
  2058. //   }
  2059. //-----------------------------------------------------------------------------
  2060.     if ((uMessage == WM_MOUSEMOVE)      ||
  2061.         (uMessage == WM_NCMOUSEMOVE)            // [NS]
  2062.       )
  2063.     {
  2064.         //---------------------------------------------------------------------
  2065.         if (Captured)
  2066.         {
  2067. //          printf("WM_MOUSEMOVE(0x%X), w=%d\n", uMessage, wparam);
  2068.             //-----------------------------------------------------------------
  2069.             // ърёЄюьэр  юсЁрсюЄър ёюс√Єш  яхЁхьх∙хэш 
  2070.             // Єъ юсЁрсюЄўшъ тхэф√ юёЄрэртыштрхЄ тё╕ эр тЁхь  cmd == SC_MOVE ?
  2071.             if (Mode == SC_MOVE)
  2072.             {
  2073.                 POINT p =
  2074.                 {
  2075.                     GET_X_LPARAM(lparam),
  2076.                     GET_Y_LPARAM(lparam)
  2077.                 };
  2078.                 ClientToScreen(hwnd, &p);
  2079. //              printf("nx=%d,ny=%d\n", p.x, p.y);
  2080.                 int dx = p.x - x;
  2081.                 int dy = p.y - y;
  2082. //              printf("dx=%d,dy=%d\n", dx, dy);
  2083.                 //-------------------------------------------------------------
  2084.                 if ((dx == 0) && (dy == 0))
  2085.                 {
  2086.                    return 0;
  2087.                    //goto window_not_moving;
  2088.                 }
  2089.                 //-------------------------------------------------------------
  2090.                 RECT r = {};
  2091.                 GetWindowRect(hwnd, &r);
  2092.  
  2093.                 // ърёЄюьэр  юсЁрсюЄър ёюс√Єш  яхЁхьх∙хэш 
  2094.                 // фшър  ьшурыър (с√ыр)
  2095.                 SetWindowPos(   hwnd,
  2096.                                 nullptr,
  2097.                                 (r.left + dx),
  2098.                                 (r.top + dy),
  2099.                                 0,
  2100.                                 0,
  2101.                                 SWP_NOOWNERZORDER       |
  2102.                                  SWP_NOZORDER           |
  2103.                                   SWP_NOSIZE            |
  2104.                                    SWP_NOSENDCHANGING
  2105.                             );
  2106.  
  2107.                 x = p.x;
  2108.                 y = p.y;
  2109.                 return 0;
  2110.             }
  2111.             //-----------------------------------------------------------------
  2112.             // ърёЄюьэр  юсЁрсюЄър ёюс√Єш  Ёхёрщчр
  2113.             else if (Mode == SC_SIZE)
  2114.             {
  2115.                 POINT p =
  2116.                 {
  2117.                     GET_X_LPARAM(lparam),
  2118.                     GET_Y_LPARAM(lparam)
  2119.                 };
  2120.                 ClientToScreen(hwnd, &p);
  2121.                 ULONG pt = ULONG(p.y << 16) | (p.x & 0xFFFF);
  2122.                 SizeRect(&Msd, pt);
  2123.                 const RECT &r = Msd.rcDragCursor;
  2124.                 //printf("r={%d,%d,%d,%d} [%dx%d]\n", r.left, r.top, r.right, r.bottom, r.right - r.left, r.bottom - r.top);
  2125.                
  2126.                 conf.win_static_size_x = r.right - r.left;
  2127.                 conf.win_static_size_y = r.bottom - r.top;
  2128.                
  2129.                 // ърёЄюьэр  юсЁрсюЄър ёюс√Єш  Ёхёрщчр
  2130.                 SetWindowPos(   hwnd,
  2131.                                 nullptr,
  2132.                                 r.left,
  2133.                                 r.top,
  2134.                                 r.right - r.left,
  2135.                                 r.bottom - r.top,
  2136.                                 SWP_NOOWNERZORDER       |
  2137.                                  SWP_NOZORDER           |
  2138.                                   SWP_NOSENDCHANGING            //???
  2139.                              );
  2140.                 return 0;
  2141.             }
  2142.         }
  2143.     }
  2144.  
  2145. window_not_moving:
  2146.  
  2147.     //-------------------------------------------------------------------------
  2148.     // WM_NCLBUTTONDOWN -> WM_SYSCOMMAND(SC_MOVE) -|-> WM_CAPTURECHANGED -> WM_GETMINMAXINFO -> WM_ENTERSIZEMOVE
  2149.     // ╧Ёш яюыєўхэшш WM_SYSCOMMAND(SC_MOVE) ёЄрэфрЁЄэр  яЁюЎхфєЁр юсЁрсюЄъш ёююс∙хэш  чряєёърхЄ ьюфры№э√щ Ўшъы
  2150.     if (uMessage == WM_SYSCOMMAND)
  2151.     {
  2152.         // printf("WM_SYSCOMMAND(0x%X), w=%X, l=%X\n", uMessage, wparam, lparam);
  2153.         //
  2154.         // ╩юфшЁютрэшх ёЄюЁюэ Ёрьъш юъэр фы  SC_SIZE (ъюф єуыр яюыєўрхЄё  ёєььшЁютрэшхь ъюфют ёьхцэ√ї ёЄюЁюэ)
  2155.         //     4           5
  2156.         //      \ ___3___ /
  2157.         //       |       |
  2158.         //       1       2
  2159.         //       |_______|
  2160.         //      /    6    \
  2161.         //     7           8
  2162.  
  2163.         ULONG Cmd = (wparam & 0xFFF0);
  2164.         ULONG BrdSide = (wparam & 0xF);
  2165.         //---------------------------------------------------------------------
  2166.         if (Cmd == SC_MOVE)             // тшфшью эх фрхь Є урЄ№ юъэю юсЁрсюЄўшъюь тхэф√
  2167.         {                               // Єъ яюър фхЁцш°№ чрцрЄє■ ь√°є
  2168.             //printf("SC_MOVE\n");      // єяЁртыхэшх яЁюуЁрььх эх яхЁхфрхЄёю
  2169.             x = GET_X_LPARAM(lparam);   // ш ёЄртшь яхЁхьхээ√х
  2170.             y = GET_Y_LPARAM(lparam);   // фы  ърёЄюьэюую юсЁрсюЄўшър
  2171.             SetCapture(hwnd);
  2172.             Captured = true;
  2173.             Mode = SC_MOVE;
  2174.             return 0;
  2175.         }
  2176.         //---------------------------------------------------------------------
  2177.         else if (Cmd == SC_SIZE)
  2178.         {
  2179.             //printf ("(Cmd == SC_SIZE)\n");
  2180.             Mode = SC_SIZE;
  2181.        
  2182.             RECT rcWindow;
  2183.             GetWindowRect(hwnd, &rcWindow);
  2184.             RECT rcClient;
  2185.             GetClientRect(hwnd, &rcClient);
  2186.             RECT rcDesktop;
  2187.             GetWindowRect(GetDesktopWindow(), &rcDesktop);
  2188.  
  2189.             Msd.cmd = int(BrdSide);
  2190.             CopyRect(&Msd. rcDragCursor, &rcWindow);
  2191.             LONG cw = rcClient.right - rcClient.left;
  2192.             LONG ch = rcClient.bottom - rcClient.top;
  2193.             LONG ww = rcWindow.right - rcWindow.left;
  2194.             LONG wh = rcWindow.bottom - rcWindow.top;
  2195.             LONG dw = rcDesktop.right - rcDesktop.left;
  2196.             LONG dh = rcDesktop.bottom - rcDesktop.top;
  2197.             Msd.ptMinTrack =
  2198.             {
  2199.                 LONG(temp.ox) + (ww - cw),
  2200.                 LONG(temp.oy) + (wh - ch)
  2201.             };
  2202.             Msd.ptMaxTrack =
  2203.             {
  2204.                 dw,
  2205.                 dh
  2206.             };
  2207.             SetCapture(hwnd);
  2208.             Captured = true;
  2209.             SizeRect(&Msd, ULONG(lparam));
  2210.             return 0;
  2211.         }
  2212.         //---------------------------------------------------------------------
  2213.     }
  2214.     //-------------------------------------------------------------------------
  2215.  
  2216. /*
  2217. #define WM_NCUAHDRAWCAPTION 0x00AE
  2218. #define WM_NCUAHDRAWFRAME   0x00AF
  2219.    if(!(uMessage == WM_SIZING || uMessage == WM_SIZE || uMessage == WM_PAINT || uMessage == WM_NCPAINT
  2220.      || uMessage == WM_MOUSEMOVE || uMessage == WM_SETCURSOR || uMessage == WM_GETICON
  2221.      || uMessage == WM_IME_SETCONTEXT || uMessage == WM_IME_NOTIFY || uMessage == WM_ACTIVATE
  2222.      || uMessage == WM_NCUAHDRAWCAPTION || uMessage == WM_NCUAHDRAWFRAME))
  2223.    {
  2224.        printf("MSG(0x%X)\n", uMessage);
  2225.    }
  2226. */
  2227.     //-------------------------------------------------------------------------
  2228.     if (conf.input.joymouse)
  2229.     {
  2230.         //---------------------------------------------------------------------
  2231.         if (uMessage == WM_LBUTTONDOWN)
  2232.         {
  2233.             //printf("input.joymouse\n");
  2234.             input.mousejoy = (input.mousejoy & 0x0F) | 0x10;    //(uMessage == WM_LBUTTONDOWN ? 0x10 : 0);
  2235.             input.kjoy = (input.kjoy & 0x0F) | 0x10;            //(uMessage == WM_LBUTTONDOWN ? 0x10 : 0);
  2236.         }
  2237.         //---------------------------------------------------------------------
  2238.         if (uMessage == WM_LBUTTONUP)
  2239.         {
  2240.             //printf("input.joymouse\n");
  2241.             input.mousejoy = (input.mousejoy & 0x0F) | 0;       //(uMessage == WM_LBUTTONDOWN ? 0x10 : 0);
  2242.             input.kjoy = (input.kjoy & 0x0F) | 0;               //(uMessage == WM_LBUTTONDOWN ? 0x10 : 0);
  2243.         }
  2244.         //---------------------------------------------------------------------
  2245.         if (uMessage == WM_MOUSEMOVE)
  2246.         {
  2247.             RECT rc; GetClientRect(hwnd, &rc);
  2248.             unsigned xx = LOWORD(lparam) * 3 / unsigned(rc.right - rc.left);
  2249.             unsigned yy = HIWORD(lparam) * 3 / unsigned(rc.bottom - rc.top);
  2250.             unsigned nn = yy * 3 + xx;
  2251. //          SetClassLongPtr(hwnd, GCLP_HCURSOR, (LONG)crs[nn]); //Alone Coder
  2252.             SetCursor(crs[nn]); //Alone Coder
  2253.             input.mousejoy = (input.mousejoy & 0x10) | mousedirs[nn];
  2254.             input.kjoy = (input.kjoy & 0x10) | mousedirs[nn];
  2255.             return 0;
  2256.         }
  2257.         //---------------------------------------------------------------------
  2258.     }
  2259.     //-------------------------------------------------------------------------
  2260. //  else if (uMessage == WM_LBUTTONDOWN && !conf.lockmouse)     // єхср∙э√щ чрїтрЄ ь√°ш
  2261.                                                                 // яЁш яюя√Єъх яхЁхтхёЄш Їюъєё эр ¤ьєы ЄюЁ
  2262.     //-------------------------------------------------------------------------                                        
  2263.     // эюЁьры№э√щ чрїтрЄ ь√°ш [NS]
  2264.     else if (   (uMessage == WM_LBUTTONDBLCLK)  &&
  2265.                 (!conf.lockmouse)               &&
  2266.                 (!dbgbreak)             // т фхсрухЁх эхы№ч  фхырЄ№ чрїтрЄ!!!!
  2267.        )
  2268.     {
  2269.         printf("%s\n", __FUNCTION__);
  2270.         input.nomouse = 20;
  2271.         main_mouse();
  2272.     }
  2273.     //-------------------------------------------------------------------------
  2274.     if (uMessage == WM_ENTERSIZEMOVE)   // ∙рё эх ёЁрсрЄ√трхЄ?
  2275.     {
  2276.         //printf("WM_ENTERSIZEMOVE(0x%X)\n", uMessage);
  2277.         sound_stop();
  2278.     }
  2279.     //-------------------------------------------------------------------------
  2280.     if (uMessage == WM_EXITSIZEMOVE)    // ∙рё эх ёЁрсрЄ√трхЄ?
  2281.     {
  2282.         //printf("WM_EXITSIZEMOVE(0x%X)\n", uMessage);
  2283.         sound_play();
  2284.     }
  2285.     //-------------------------------------------------------------------------
  2286.     if (        (uMessage == WM_SIZE) ||
  2287.                 (uMessage == WM_MOVE) ||
  2288.                 (uMessage == WM_USER)
  2289.       )
  2290.     {
  2291.  
  2292. /*
  2293.         //debug
  2294.         printf("%s(WM_SIZE || WM_MOVE || WM_USER)\n", __FUNCTION__);
  2295.         RECT rr = {};
  2296.         GetWindowRect(wnd, &rr);
  2297.         printf("r={%d,%d,%d,%d} [%dx%d]\n", rr.left, rr.top, rr.right, rr.bottom, rr.right - rr.left, rr.bottom - rr.top);
  2298. */
  2299.  
  2300.         GetClientRect(wnd, &temp.client);
  2301.      
  2302. /*
  2303.         //debug
  2304.         printf("temp.client={%d,%d,%d,%d} \n",  temp.client.left,
  2305.                                                 temp.client.top,
  2306.                                                 temp.client.right,
  2307.                                                 temp.client.bottom);
  2308. */
  2309.         temp.gdx = unsigned(temp.client.right-temp.client.left);
  2310.         temp.gdy = unsigned(temp.client.bottom-temp.client.top);
  2311.  
  2312.         temp.gx = (temp.gdx > temp.ox)    ?     (temp.gdx-temp.ox) / 2 :
  2313.                                                 0;
  2314.         temp.gy = (temp.gdy > temp.oy)    ?     (temp.gdy-temp.oy) / 2 :
  2315.                                                 0;
  2316.  
  2317.         ClientToScreen(wnd, (POINT*)&temp.client.left);
  2318.         ClientToScreen(wnd, (POINT*)&temp.client.right);
  2319.  
  2320. //      printf("temp.client.left %d\n",temp.client.left);
  2321. //      printf("temp.client.right %d\n",temp.client.right);
  2322.        
  2323.         adjust_mouse_cursor();
  2324.         //---------------------------------------------------------------------
  2325.         if (sprim)                      // яю ьюхьє ¤Єю overlay driver
  2326.             uMessage = WM_PAINT;
  2327.         //---------------------------------------------------------------------
  2328.         needclr = 2;
  2329.         //uMessage = WM_PAINT;  //test
  2330.         //---------------------------------------------------------------------
  2331.         if (    (uMessage == WM_SIZE)           &&
  2332.                 (wparam != SIZE_MINIMIZED)      &&
  2333.                 temp.ox                         &&
  2334.                 temp.oy
  2335.           )
  2336.         {
  2337.             //-----------------------------------------------------------------
  2338.             if (wnd && (temp.rflags & RF_D3D)) // skip call from CreateWindow
  2339.             {
  2340.                 //printf("%s(WM_SIZE, temp.rflags & RF_D3D)\n", __FUNCTION__);
  2341.                 SetVideoModeD3d(false);
  2342.             }
  2343.             //-----------------------------------------------------------------
  2344.         }
  2345.         //---------------------------------------------------------------------
  2346.     }
  2347.     //-------------------------------------------------------------------------
  2348.  
  2349. /*
  2350. ыюу ёюс√Єшщ яЁш Є√ърэшш яю уыртэющ ьхэ■°ъх
  2351.         WM_NCHITTEST
  2352.         WM_SETCURSOR
  2353.         WM_NCLBUTTONDOWN
  2354.         WM_SYSCOMMAND
  2355.        
  2356.         WM_ENTERMENULOOP       
  2357.         WM_SETCURSOR
  2358.         WM_INITMENU
  2359.                         фхЄю фю ¤Єюую яЁюшёїюфшЄ юёЄрты эшх яЁхф юъэр
  2360.         WM_MENUSELECT           !!! ЄєЄ ьюцэю чрЄшЁрЄ№ ьєёюЁ
  2361.         WM_INITMENUPOPUP        !!! ЄєЄ ьюцэю чрЄшЁрЄ№ ьєёюЁ
  2362.         WM_NCMOUSELEAVE
  2363.         WM_ENTERIDLE            !!! ЄєЄ ьюцэю чрЄшЁрЄ№ ьєёюЁ
  2364.         WM_ENTERIDLE
  2365.         WM_ENTERIDLE
  2366.         WM_UNINITMENUPOPUP
  2367.         WM_CAPTURECHANGED
  2368.  
  2369.         WM_MENUSELECT
  2370.        
  2371.         WM_EXITMENULOOP
  2372.        
  2373.         WM_NCACTIVATE
  2374.         WM_ACTIVATE
  2375.         WM_ACTIVATEAPP
  2376.         WM_ACTIVATEAPP
  2377.         WM_KILLFOCUS
  2378.  
  2379. */
  2380.  
  2381.     //-------------------------------------------------------------------------
  2382.     if (!dbgbreak)                                              //[NS]  ╩юёЄ√ыш
  2383.     {
  2384.         if (uMessage == WM_ENTERMENULOOP)       // фы  Єє°хэш  чрЎшъыхээюую сєЇхЁр чтєър
  2385.         {                                       // эр тЁхь  ьхэ■°ъш
  2386.             //printf("WM_ENTERMENULOOP ");
  2387.             OnEnterGui();
  2388.         }
  2389.         //---------------------------------------------------------------------
  2390. //      // [NS] яЁюёЄю ъръшхЄю ьєфръш т WM_PAINT эх фхырыш flip() яхЁхЁшёютъє ¤ъЁрэр
  2391. //      // р фхырыш "ёъЁшэ°юЄ" тю тЁхь  WM_KILLFOCUS ш яюЄюь хую шэюуфр яюърч√трыш тёхуфр ъюуфр эх эрфю
  2392. //      if (uMessage == WM_INITMENUPOPUP)       // фы  шчсртыхэш  юЄ тёхуфр тшё ўхщ
  2393. //      {                                       // 1-щ ЄъэєЄющ ьхэ■°ъш эр Їюэх
  2394. //          //printf("WM_INITMENUPOPUP ");      // т эх GDI Ёхцшьрї
  2395. //          flip();
  2396. //      }
  2397.         //---------------------------------------------------------------------
  2398.         if (uMessage == WM_EXITMENULOOP)        // эр тё ъшщ ёыєўрщ яю т√їюфє
  2399.         {                                       // юЇшЎшры№эю чтєъ тъы■ўрхь
  2400.             //printf("WM_EXITMENULOOP ");               // їюЄ  юэ, эр тшф, шуЁрхЄ ш схч ¤Єюую
  2401.             OnExitGui();
  2402.         }
  2403.     }
  2404.     //-------------------------------------------------------------------------
  2405.  
  2406.     //-------------------------------------------------------------------------
  2407.     if (uMessage == WM_PAINT)
  2408.     {  
  2409.         //printf("WM_PAINT ");
  2410.         //---------------------------------------------------------------------
  2411.         // чрЄшЁрэшх эхюсэюты хь√ї їтюёЄют т фхсрухЁх [NS]
  2412.         if (dbgbreak)  
  2413.         {
  2414.             debugflip();        //ьюцхЄ т√эхёЄш т flip() яю Єръюьє цх єёыютш■
  2415.         }
  2416.         // чрЄшЁрэшх эхюсэюты хь√ї їтюёЄют т ¤ьєы ЄюЁх
  2417.         else
  2418.         {
  2419.             flip();
  2420.         }
  2421.         //---------------------------------------------------------------------
  2422.         if (sprim)                                              // OVERLAY
  2423.         { // background for overlay
  2424.             //printf("WM_PAINT overlay\n");
  2425.             RECT rc;
  2426.             GetClientRect(hwnd, &rc);
  2427.             //HBRUSH br = CreateSolidBrush(RGB(0xFF,0x00,0xFF));
  2428.             HBRUSH br = CreateSolidBrush(RGB(0x04,0x01,0x02));
  2429.             //Ёшёєхь ътрфЁрЄшъ ўхЁхч ъюЄюЁ√щ сєфхь ёьюЄЁхЄ№ т хтЁюяє
  2430.             //р ыєў°х ¤Єю с√ыю с√ фхыюЄ№ "ъшёЄ№■" ъюЄюЁр  тююс∙х чръЁр°штрхЄ юъэю ёрьющ яхЁтющ
  2431.             FillRect(   temp.gdidc,
  2432.                         &rc,
  2433.                         br
  2434.                      );
  2435.             DeleteObject(br);
  2436.             update_overlay();
  2437.         }
  2438.         //---------------------------------------------------------------------
  2439.         else if (hbm && !active)
  2440.         {
  2441.             // юЄЁшёют√трхЄ ¤ъЁрэ тю тЁхь  яхЁхьх∙хэш  фЁєушї юъюэ яю яютхЁїэюёЄш
  2442.             // юэю цх яхЁхЁшёют√трхЄ фхсрухЁ яЁш яхЁхьх∙хэшш юъюэ ётхЁїє
  2443.             // ═╬ ╬═╬ ЁшёєхЄ єёЄрЁхт°є■ ърЁЄшэъє !!!!
  2444.             // хёыш єсЁрЄ№ т фхсрухЁх схыт√х ёыхф√!!!
  2445.             // ш схыт√х їтюёЄ√ эр чї ¤ъЁрэх (юёюсхээю тшфэю яЁш эшчъющ ўрёЄюЄх шэЄр)
  2446.             //printf("%s, WM_PAINT\n", __FUNCTION__);
  2447.            
  2448.             //printf("!! ");
  2449.             HDC hcom = CreateCompatibleDC(temp.gdidc);
  2450.             HGDIOBJ PrevObj = SelectObject(hcom, hbm);
  2451.  
  2452.             //BitBlt(hdcDest, xDest, yDest, xWidth, yHeight, hdcSrc, xSrc, ySrc, dwROP);
  2453.  
  2454.             // [NS] ¤Єю урЇэю ╫└╤╥╬ тёхуфр ЁшёєхЄ ╙╞┼ єёЄрЁхт°хх шчюсЁЁрцхэшх
  2455. //          BitBlt(     temp.gdidc,     // hdcDest      //юЁшушшэры№э√щ ъюф
  2456. //                      0,              // xDest
  2457. //                      0,              // yDest
  2458. //                      int(bm_dx),     // xWidth
  2459. //                      int(bm_dy),     // yHeight
  2460. //                      hcom,           // hdcSrc
  2461. //                      0,              // xSrc
  2462. //                      0,              // ySrc
  2463. //                      SRCCOPY         // dwROP
  2464. //                  );
  2465.  
  2466.  
  2467.                    
  2468.                   // [NS] not works     (¤Єю ь√ я√Єрышё№ фхырЄ№ debug_flip() эю схч яюыэющ яхЁхёЄЁЁющъш сєЇхЁр)
  2469.                   /*
  2470.     SetDIBitsToDevice(  temp.gdidc,
  2471.                        
  2472.                         int(temp.gx),
  2473.                         int(temp.gy),
  2474.                         temp.ox,
  2475.                         temp.oy,
  2476.                        
  2477.                         0,
  2478.                         0,
  2479.                         temp.ox,
  2480.                         temp.oy,
  2481.                        
  2482.                         gdi_dbg_buf,            //gdibuf,
  2483.                         &gdi_dbg_bmp.header,    //&gdibmp.header,
  2484.                         DIB_RGB_COLORS
  2485.                       );
  2486.                       */
  2487.                      
  2488.          
  2489.             SelectObject(hcom, PrevObj);
  2490.             DeleteDC(hcom);
  2491.         }
  2492.         //---------------------------------------------------------------------
  2493.     }
  2494.     //-------------------------------------------------------------------------
  2495.     if (uMessage == WM_SYSCOMMAND)
  2496.     {
  2497.         //  printf("%s, WM_SYSCOMMAND 0x%04X\n", __FUNCTION__, (ULONG)wparam);
  2498.  
  2499.         switch (wparam & 0xFFF0)
  2500.         {
  2501.             //-----------------------------------------------------------------
  2502.             case SCU_SCALE1:    temp.scale = 1; wnd_resize(1);  return 0;
  2503.             case SCU_SCALE2:    temp.scale = 2; wnd_resize(2);  return 0;
  2504.             case SCU_SCALE3:    temp.scale = 3; wnd_resize(3);  return 0;
  2505.             case SCU_SCALE4:    temp.scale = 4; wnd_resize(4);  return 0;
  2506.             //-----------------------------------------------------------------
  2507.             case SCU_LOCK_MOUSE:
  2508.                 main_mouse();
  2509.                 return 0;
  2510.             //-----------------------------------------------------------------
  2511.             case SC_CLOSE:
  2512.                 //-------------------------------------------------------------
  2513.                 if (ConfirmExit())
  2514.                     correct_exit();
  2515.                 //-------------------------------------------------------------
  2516.                 return 0;
  2517.             //-----------------------------------------------------------------
  2518.             case SC_MINIMIZE:
  2519.                 temp.Minimized = true;
  2520.                 break;
  2521.             //-----------------------------------------------------------------
  2522.             case SC_RESTORE:
  2523.                 temp.Minimized = false;
  2524.                 break;
  2525.             //-----------------------------------------------------------------
  2526.         }
  2527.     }
  2528.     //-------------------------------------------------------------------------
  2529.     if (uMessage == WM_DROPFILES)
  2530.     {
  2531.         HDROP hDrop = (HDROP)wparam;
  2532.         DragQueryFile( hDrop, 0, droppedFile, sizeof(droppedFile));
  2533.         DragFinish( hDrop);
  2534.         return 0;
  2535.     }
  2536.     //-------------------------------------------------------------------------
  2537. //#endif
  2538.     //-------------------------------------------------------------------------
  2539.     if (uMessage == WM_COMMAND) // яючршьёЄтютрэю є TSL
  2540.     {
  2541.         int disk = -1;
  2542.         //---------------------------------------------------------------------
  2543.         switch(wparam)
  2544.         {
  2545.             //=================================================================
  2546.             // FILE
  2547.             //=================================================================
  2548.             //    LOAD
  2549.             case IDM_LOAD:              opensnap();             break;
  2550.             //-----------------------------------------------------------------
  2551.             //    SAVE
  2552.             case IDM_SAVE:              savesnap();             break;
  2553.             //-----------------------------------------------------------------
  2554.             case IDM_SAVE_DISKB:        disk = 1;               goto save_disk;
  2555.             case IDM_SAVE_DISKC:        disk = 2;               goto save_disk;
  2556.             case IDM_SAVE_DISKD:        disk = 3;               goto save_disk;
  2557. save_disk:
  2558.                 sound_stop();
  2559.                 savesnap(disk);
  2560.                 eat();
  2561.                 sound_play();
  2562.                 break;
  2563.             //-----------------------------------------------------------------
  2564.             //    QUICKLOAD
  2565.             case IDM_QUICKLOAD_1:       qload1();               break;
  2566.             case IDM_QUICKLOAD_2:       qload2();               break;
  2567.             case IDM_QUICKLOAD_3:       qload3();               break;
  2568.             //-----------------------------------------------------------------
  2569.             //    QUICKSAVE
  2570.             case IDM_QUICKSAVE_1:       qsave1();               break;
  2571.             case IDM_QUICKSAVE_2:       qsave2();               break;
  2572.             case IDM_QUICKSAVE_3:       qsave3();               break;
  2573.             //-----------------------------------------------------------------
  2574.             case IDM_AUDIOREC:          savesnddialog();        break;
  2575.             //-----------------------------------------------------------------
  2576.             case IDM_MAKESCREENSHOT:    main_scrshot();         break;
  2577.             //-----------------------------------------------------------------
  2578.             case IDM_EXIT:              correct_exit();         break;
  2579.             //=================================================================
  2580.             // Emulation
  2581.             //=================================================================
  2582.             case IDM_PAUSE:             main_pause();           break;
  2583.             //-----------------------------------------------------------------
  2584.             case IDM_MAXIMUMSPEED:      main_maxspeed();        break;
  2585.             //-----------------------------------------------------------------
  2586.             //    RESET
  2587.             case IDM_RESET:             main_reset();           break;
  2588.             case IDM_RESET_128:         main_reset128();        break;
  2589.             case IDM_RESET_48:          main_resetbas();        break;
  2590.             case IDM_RESET_48_LOCK:     main_reset48();         break; // [NS]
  2591.             case IDM_RESET_DOS:         main_resetdos();        break;
  2592.             case IDM_RESET_SERVICE:     main_resetsys();        break;
  2593.             case IDM_RESET_CACHE:       main_resetcache();      break;
  2594.             case IDM_RESET_GS:          reset_gs();             break;
  2595.             //-----------------------------------------------------------------
  2596.             //    NMI
  2597.             case IDM_NMI:               main_nmi();             break;
  2598.             case IDM_NMI_DOS:           main_nmidos();          break;
  2599.             case IDM_NMI_CACHE:         main_nmicache();        break;
  2600.             //-----------------------------------------------------------------
  2601.             case IDM_POKE: main_poke(); break;
  2602.             //-----------------------------------------------------------------
  2603.             //    TAPE
  2604.             case IDM_TAPE_CONTROL:      main_starttape();               break;
  2605.             case IDM_USETAPETRAPS:      conf.tape_traps ^= 1;           break;
  2606.             case IDM_AUTOSTARTTAPE:     conf.tape_autostart ^= 1;       break;
  2607.             case IDM_TAPE_BROWSER:      main_tapebrowser();             break;
  2608.             //-----------------------------------------------------------------
  2609.             case IDM_SETTINGS:
  2610.                 if (!dbgbreak)
  2611.                     setup_dlg();        //эрёЄЁющъш ё т√їюфюь т хсєы ЄюЁ (фхсрухЁ ЁрёъюысрёшЄ)
  2612.                 else
  2613.                     mon_setup_dlg();    //эрёЄЁющъш ё т√їюфюь т фхсрухЁ
  2614.                 break;
  2615.             //=================================================================
  2616.             // VIEW
  2617.             //=================================================================
  2618.             case IDM_FULLSCREEN: main_fullscr(); break;
  2619.             //-----------------------------------------------------------------
  2620.             //    SIZE
  2621.             case IDM_SCALE1:    temp.scale = 1; wnd_resize(1);  break;
  2622.             case IDM_SCALE2:    temp.scale = 2; wnd_resize(2);  break;
  2623.             case IDM_SCALE3:    temp.scale = 3; wnd_resize(3);  break;
  2624.             case IDM_SCALE4:    temp.scale = 4; wnd_resize(4);  break;
  2625.             //-----------------------------------------------------------------
  2626.             case IDM_VIDEO_DRIVER: main_selectdriver(); break;
  2627.             //-----------------------------------------------------------------
  2628.             case IDM_VIDEOFILTER: main_selectfilter(); break;
  2629.             //=================================================================
  2630.             // Input
  2631.             //-----------------------------------------------------------------
  2632.             case IDM_KEYSTICK:          main_keystick();                break;
  2633.             //-----------------------------------------------------------------
  2634.             case IDM_FULL_XT_KEYBOARD:  main_atmkbd();                  break;
  2635.             //=================================================================
  2636.             // Tools
  2637.             //=================================================================
  2638.             case IDM_TOOLS_PAL_ATM3_PAL: run_debug_tool( DT_PALETTE_ATM3_PAL);  break;
  2639.             case IDM_TOOLS_PAL_COMP_PAL: run_debug_tool( DT_PALETTE_COMP_PAL);  break;
  2640.             case IDM_TOOLS_PAL_PAL0:     run_debug_tool( DT_PALETTE_PAL0);      break;
  2641.             //-----------------------------------------------------------------
  2642.             case IDM_TEST_DEBUG_TOOL:    run_debug_tool( DT_TEST);              break;
  2643.             //-----------------------------------------------------------------
  2644.             case IDM_TEST_BUTTON_1:     mon_show_labels();              break; 
  2645.             case IDM_TEST_BUTTON_2:                                     break; 
  2646.             case IDM_TEST_BUTTON_3:                                     break; 
  2647.             case IDM_TEST_BUTTON_4:                                     break; 
  2648.             //-----------------------------------------------------------------
  2649.             case IDM_GS_BASS_STATUS:    mon_gsdialog();                 break; 
  2650.             //=================================================================
  2651.             // Debug
  2652.             //=================================================================
  2653.             case IDM_MEMORY_SEARCH: main_cheat(); break;
  2654.             //-----------------------------------------------------------------
  2655.             case IDM_MEMORY_BAND:
  2656.                 //ёфхырэю ъюёЄ√ыхь !!!!
  2657.                 // *(&conf.led.ay + 6) ^= 0x80000000;   //mbnd
  2658.                 // *(&conf.led.ay + 7) &= 0x7FFFFFFF;   //mbnd256
  2659.                 conf.led.memband     ^= 0x80000000;     //mbnd
  2660.                 conf.led.memband_256 &= 0x7FFFFFFF;     //mbnd256
  2661.                 apply_video();  // схч эхую эх тъы■ўрхЄёю ?
  2662.                 break;
  2663. force_memory_band:
  2664.                 // *(&conf.led.ay + 6) |= 0x80000000;   //mbnd
  2665.                 // *(&conf.led.ay + 7) &= 0x7FFFFFFF;   //mbnd256
  2666.                 conf.led.memband     |= 0x80000000;     //mbnd
  2667.                 conf.led.memband_256 &= 0x7FFFFFFF;     //mbnd256
  2668.                 apply_video();
  2669.                 break;
  2670.             //-----------------------------------------------------------------
  2671.             case IDM_MEMORY_BAND_1:   conf.led.bandBpp = 512;   goto force_memory_band; //break;
  2672.             case IDM_MEMORY_BAND_2:   conf.led.bandBpp = 256;   goto force_memory_band; //break;
  2673.             case IDM_MEMORY_BAND_4:   conf.led.bandBpp = 128;   goto force_memory_band; //break;
  2674.             case IDM_MEMORY_BAND_8:   conf.led.bandBpp = 64;    goto force_memory_band; //break;
  2675.             //-----------------------------------------------------------------
  2676.             case IDM_MEMORY_BAND_256:   // ╩╬╤╥█╦▄ !!!!
  2677.                 // *(&conf.led.ay + 6) &= 0x7FFFFFFF;   //mbnd
  2678.                 // *(&conf.led.ay + 7) ^= 0x80000000;   //mbnd256
  2679.                 conf.led.memband     &= 0x7FFFFFFF;     //mbnd
  2680.                 conf.led.memband_256 ^= 0x80000000;     //mbnd256
  2681.                 apply_video();
  2682.                 break;
  2683. force_memory_band_256:
  2684.                 // *(&conf.led.ay + 6) &= 0x7FFFFFFF;   //mbnd
  2685.                 // *(&conf.led.ay + 7) |= 0x80000000;   //mbnd256
  2686.                 conf.led.memband     &= 0x7FFFFFFF;     //mbnd
  2687.                 conf.led.memband_256 |= 0x80000000;     //mbnd256
  2688.                 apply_video();
  2689.                 break;
  2690.             //-----------------------------------------------------------------
  2691.             case IDM_MEMORY_BAND_256_256PPL:    goto force_memory_band_256;
  2692.             //-----------------------------------------------------------------
  2693.             case IDM_BREAKPOINTS:       mon_bpdialog();                 break;
  2694.             //-----------------------------------------------------------------
  2695.             case IDM_WATCH_DIALOG:      mon_watchdialog();              break;
  2696.             //-----------------------------------------------------------------
  2697.             case IDM_DEBUGGER: 
  2698.                 if (!dbgbreak)
  2699.                     main_debug();       //тїюф т фхсрухЁ
  2700.                 else
  2701.                     mon_emul();         //т√їюф шч фхсрухЁр
  2702.                 dbg_force_exit = 1;
  2703.                 break;
  2704.             //=================================================================
  2705.             // Help
  2706.             //=================================================================
  2707.             case IDM_HELP_SHORTKEYS:    main_help();     break;
  2708.             //-----------------------------------------------------------------
  2709.             case IDM_HELP_ABOUT:        main_about();    break;
  2710.                 //DialogBox(hIn, MAKEINTRESOURCE(IDD_ABOUT), wnd, aboutdlg); break;
  2711.  
  2712.  
  2713.             //-----------------------------------------------------------------
  2714.         }
  2715.         //---------------------------------------------------------------------
  2716.                 //needclr=1;
  2717.     }
  2718.     //-------------------------------------------------------------------------
  2719.  
  2720.     return DefWindowProc( hwnd, uMessage, wparam, lparam);
  2721. }
  2722. //=============================================================================
  2723.  
  2724.  
  2725.  
  2726.  
  2727.  
  2728. //=============================================================================
  2729. void readdevice( VOID *md, DWORD sz, LPDIRECTINPUTDEVICE dev)
  2730. {
  2731.     //-------------------------------------------------------------------------
  2732.     if (!active || !dev)
  2733.         return;
  2734.     //-------------------------------------------------------------------------
  2735.     HRESULT r = dev->GetDeviceState( sz, md);
  2736.     //-------------------------------------------------------------------------
  2737.     if ((r == DIERR_INPUTLOST) || (r == DIERR_NOTACQUIRED))
  2738.     {
  2739.         //---------------------------------------------------------------------
  2740.         r = dev->Acquire();
  2741.         //---------------------------------------------------------------------
  2742.         while (r == DIERR_INPUTLOST)
  2743.             r = dev->Acquire();
  2744.         //---------------------------------------------------------------------
  2745.         if (r == DIERR_OTHERAPPHASPRIO) // ╧Ёшыюцхэшх эрїюфшЄё  т background
  2746.             return;
  2747.         //---------------------------------------------------------------------
  2748.         if (r != DI_OK)
  2749.         {
  2750.             printrdi("IDirectInputDevice::Acquire()", r);
  2751.             exit();
  2752.         }
  2753.         //---------------------------------------------------------------------
  2754.         r = dev->GetDeviceState( sz, md);
  2755.     }
  2756.     //---------------------------------------------------------------------
  2757.     if (r != DI_OK)
  2758.     {
  2759.         printrdi("IDirectInputDevice::GetDeviceState()", r);
  2760.         exit();
  2761.     }
  2762.     //---------------------------------------------------------------------
  2763. }
  2764. //=============================================================================
  2765.  
  2766.  
  2767.  
  2768.  
  2769. //=============================================================================
  2770. void readmouse( DIMOUSESTATE *md)
  2771. {
  2772.     memset( md, 0, sizeof *md);
  2773.     readdevice( md, sizeof *md, dimouse);
  2774. }
  2775. //=============================================================================
  2776. void ReadKeyboard( PVOID KbdData)
  2777. {
  2778.     //memset( KbdData, 0, 256); //TZT эх яюьюурхЄ
  2779.     readdevice( KbdData, 256, dikeyboard);                     
  2780. }
  2781. //=============================================================================
  2782. void setpal(char system)
  2783. {
  2784.     //-------------------------------------------------------------------------
  2785.     if (!active || !dd || !surf0 || !pal)
  2786.         return;
  2787.     //-------------------------------------------------------------------------
  2788.     HRESULT r;
  2789.     //-------------------------------------------------------------------------
  2790.     if (surf0->IsLost() == DDERR_SURFACELOST)
  2791.         surf0->Restore();
  2792.     //-------------------------------------------------------------------------
  2793.     if (  ( r = pal->SetEntries( 0, 0, 0x100, system  ? syspalette :
  2794.                                                         pal0)
  2795.           ) != DD_OK
  2796.        )
  2797.     {
  2798.         printrdd("IDirectDrawPalette::SetEntries()", r);
  2799.         exit();
  2800.     }
  2801.     //-------------------------------------------------------------------------
  2802. }
  2803. //=============================================================================
  2804.  
  2805.  
  2806. //=============================================================================
  2807. static void trim_right(char *str)
  2808. {
  2809.     size_t i; //Alone Coder 0.36.7
  2810.     //-------------------------------------------------------------------------
  2811.     for (/*unsigned*/ i = strlen(str);    i && str[i - 1] == ' ';    i--);
  2812.         str[i] = 0;
  2813.     //-------------------------------------------------------------------------
  2814. }
  2815. //=============================================================================
  2816.  
  2817.  
  2818.  
  2819. //=============================================================================
  2820. #define MAX_MODES 512
  2821.  
  2822. static struct MODEPARAM
  2823. {
  2824.     unsigned x;
  2825.     unsigned y;
  2826.     unsigned b;
  2827.     unsigned f;
  2828. } modes[MAX_MODES];
  2829.  
  2830. static unsigned max_modes;
  2831.  
  2832. // ─ы  шэшЎшрышчрЎшш fullscreen Ёхцшьр эхюсїюфшью т√яюыэхэшх эхёъюыЄъшї єёыютшщ:
  2833. // 1. ╨рчьхЁ юъэр фюыцхэ ёютярфрЄ№ ё ЁрчЁх°хэшхь ¤ъЁрэр, ъююЁфшэрЄ√ ыхтюую тхЁїэхую єуыр фюыцэ√ с√Є№ 0, 0
  2834. // 2. ╬ъэю фюыцэю шьхЄ№ Ёрё°шЁхээ√щ ёЄшы№ WS_EX_TOPMOST
  2835. // ╧Ёш эх т√яюыэхэшш їюЄ  с√ юфэюую шч яєэъЄют яЁш тючтЁрЄх шч fullscreen ъ юъээюьє Ёхцшьє эр vista ш т√°х сєфхЄ
  2836. // юЄъ■ўхэ DWM ш юъэю яЁшюсЁхЄхЄ "єёЄрЁхт°шщ" тшф сюЁф■Ёр
  2837.  
  2838. //=============================================================================
  2839. static void SetVideoModeD3d(bool Exclusive)
  2840. {
  2841.     HRESULT r;
  2842. //    printf("%s\n", __FUNCTION__);
  2843.  
  2844.     //-------------------------------------------------------------------------
  2845.     if (!wnd)
  2846.     {
  2847.         __debugbreak();
  2848.     }
  2849.     //-------------------------------------------------------------------------
  2850.     // release textures if exist
  2851.     if (SurfTexture)
  2852.     {
  2853.         ULONG RefCnt = SurfTexture->Release();
  2854.         (void)RefCnt;
  2855. /*
  2856. #ifdef _DEBUG
  2857.         if (RefCnt != 0)
  2858.         {
  2859.             __debugbreak();
  2860.         }
  2861. #endif
  2862. */
  2863.         SurfTexture = nullptr;
  2864.     }
  2865.     //-------------------------------------------------------------------------
  2866.     if (Texture)
  2867.     {
  2868.         ULONG RefCnt = Texture->Release();
  2869.        
  2870. #ifdef _DEBUG //---------------------------------------------------------------
  2871.         if (RefCnt != 0)
  2872.         {
  2873.             __debugbreak();
  2874.         }
  2875. #endif //----------------------------------------------------------------------
  2876.  
  2877.         Texture = nullptr;
  2878.     }
  2879.     //-------------------------------------------------------------------------
  2880.     bool CreateDevice = false;
  2881.     //-------------------------------------------------------------------------
  2882.     if (!D3dDev)
  2883.     {
  2884.         CreateDevice = true;
  2885.         //---------------------------------------------------------------------
  2886.         if (!D3d9)
  2887.         {
  2888.             StartD3d( wnd);
  2889.         }
  2890.         //---------------------------------------------------------------------
  2891.     }
  2892.     //-------------------------------------------------------------------------
  2893.     D3DDISPLAYMODE DispMode;
  2894.     r = D3d9->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &DispMode);
  2895.     //-------------------------------------------------------------------------
  2896.     if (r != D3D_OK)
  2897.     {
  2898.         printrdd("IDirect3D::GetAdapterDisplayMode()", r); exit();
  2899.     }
  2900.     //-------------------------------------------------------------------------
  2901.     D3DPRESENT_PARAMETERS D3dPp = { };
  2902.     //-------------------------------------------------------------------------
  2903.     // exclusive full screen
  2904.     if (Exclusive)
  2905.     {
  2906. /*  
  2907. #if 0 //-----------------------------------------------------------------------
  2908.         printf("exclusive full screen (%ux%u %uHz)\n", DispMode.Width, DispMode.Height, temp.ofq);
  2909.         RECT rr = { };
  2910.         GetWindowRect(wnd, &rr);
  2911.         printf("r1={%d,%d,%d,%d} [%dx%d]\n", rr.left, rr.top, rr.right, rr.bottom, rr.right - rr.left, rr.bottom - rr.top);
  2912.         printf("SetWindowPos(%p, HWND_TOPMOST, 0, 0, %u, %u)\n", wnd, DispMode.Width, DispMode.Height);
  2913. #endif //----------------------------------------------------------------------
  2914. */
  2915.         //---------------------------------------------------------------------
  2916.         //їч ъюуфр
  2917.         if ( !SetWindowPos(     wnd,
  2918.                                 HWND_TOPMOST,
  2919.                                 0,
  2920.                                 0,
  2921.                                 int(DispMode.Width),    //°шЁшэр
  2922.                                 int(DispMode.Height),   //т√ёюЄр
  2923.                                 0
  2924.                         )
  2925.           ) // ╙ёЄрэютър WS_EX_TOPMOST
  2926.         {
  2927.             __debugbreak();
  2928.         }
  2929.         //---------------------------------------------------------------------
  2930. /*
  2931. #if 0 //-----------------------------------------------------------------------
  2932.         rr = { };
  2933.         GetWindowRect(wnd, &rr);
  2934.         printf("r2={%d,%d,%d,%d} [%dx%d]\n", rr.left, rr.top, rr.right, rr.bottom, rr.right - rr.left, rr.bottom - rr.top);
  2935. #endif //----------------------------------------------------------------------
  2936. */
  2937.         D3dPp.Windowed = FALSE;
  2938.         D3dPp.BackBufferWidth = DispMode.Width;
  2939.         D3dPp.BackBufferHeight = DispMode.Height;
  2940.         D3dPp.BackBufferFormat = DispMode.Format;
  2941.         D3dPp.FullScreen_RefreshRateInHz = temp.ofq;
  2942.         D3dPp.PresentationInterval = conf.flip    ?     D3DPRESENT_INTERVAL_ONE :
  2943.                                                         D3DPRESENT_INTERVAL_IMMEDIATE;
  2944.     }
  2945.     //-------------------------------------------------------------------------
  2946.     // windowed mode
  2947.     else
  2948.     {
  2949. /*
  2950. #if 0 //-----------------------------------------------------------------------
  2951.         printf("windowed mode\n");
  2952.         RECT rr = { };
  2953.         GetWindowRect(wnd, &rr);
  2954.         printf("w=%p, r={%d,%d,%d,%d} [%dx%d]\n", wnd, rr.left, rr.top, rr.right, rr.bottom, rr.right - rr.left, rr.bottom - rr.top);
  2955. #endif //----------------------------------------------------------------------
  2956. */
  2957.         D3dPp.Windowed = TRUE;
  2958.     }
  2959.     //-------------------------------------------------------------------------
  2960.     D3dPp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  2961.     D3dPp.BackBufferCount = 1;
  2962.     D3dPp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
  2963.     D3dPp.hDeviceWindow = wnd;
  2964.     //-------------------------------------------------------------------------
  2965.     if (CreateDevice)
  2966.     {
  2967.         r = D3d9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, wnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3dPp, &D3dDev);
  2968.         //---------------------------------------------------------------------
  2969.         if (r != D3D_OK)
  2970.         {
  2971.             printrdd("IDirect3D::CreateDevice()", r);
  2972.             exit();
  2973.         }
  2974.         //---------------------------------------------------------------------
  2975.         if ( !SUCCEEDED( r = D3dDev->TestCooperativeLevel() ))
  2976.         {
  2977.             printrdd("IDirect3DDevice::TestCooperativeLevel()", r);
  2978.             exit();
  2979.         }
  2980.         //---------------------------------------------------------------------
  2981.     }
  2982.     //-------------------------------------------------------------------------
  2983.     // reset existing device
  2984.     else
  2985.     {
  2986.         //---------------------------------------------------------------------
  2987.         r = D3D_OK;
  2988.         do
  2989.         {
  2990.             if (r != D3D_OK)
  2991.             {
  2992.                 Sleep(10);
  2993.             }
  2994.             r = D3dDev->Reset(&D3dPp);
  2995.         }
  2996.         while (r == D3DERR_DEVICELOST);
  2997.         //---------------------------------------------------------------------
  2998.         if (r != DD_OK)
  2999.         {
  3000.             printrdd("IDirect3DDevice9::Reset()", r);
  3001. //          __debugbreak();
  3002.             exit();
  3003.         }
  3004.         //---------------------------------------------------------------------
  3005. //      printf("D3dDev->Reset(%d, %d)\n", D3dPp.BackBufferWidth, D3dPp.BackBufferHeight);
  3006.     }
  3007.     //-------------------------------------------------------------------------
  3008.     // recreate textures
  3009. //    printf("IDirect3DDevice9::CreateTexture(%d,%d)\n", temp.ox, temp.oy);
  3010.     r = D3dDev->CreateTexture(  temp.ox,
  3011.                                 temp.oy,
  3012.                                 1,
  3013.                                 D3DUSAGE_DYNAMIC,
  3014.                                 DispMode.Format,
  3015.                                 D3DPOOL_DEFAULT,
  3016.                                 &Texture,
  3017.                                 nullptr
  3018.                               );
  3019.     //-------------------------------------------------------------------------
  3020.     if (r != DD_OK)
  3021.     {
  3022.         printrdd("IDirect3DDevice9::CreateTexture()", r);
  3023.         exit();
  3024.     }
  3025.     //-------------------------------------------------------------------------
  3026.     r = Texture->GetSurfaceLevel( 0, &SurfTexture);
  3027.     if (r != DD_OK)
  3028.     {
  3029.         printrdd("IDirect3DTexture::GetSurfaceLevel()", r);
  3030.         exit();
  3031.     }
  3032.     //-------------------------------------------------------------------------
  3033.     if (!SurfTexture)
  3034.         __debugbreak();
  3035.     //-------------------------------------------------------------------------
  3036. }
  3037. //=============================================================================
  3038.  
  3039. static bool NeedRestoreDisplayMode = false;
  3040.  
  3041.  
  3042.  
  3043.  
  3044.  
  3045.  
  3046.  
  3047.  
  3048. //=============================================================================
  3049. //void set_vidmode()
  3050. void set_vidmode( bool preserve_size)                           // [NS]
  3051. {
  3052. // bool preserve_size = FALSE by default !!!
  3053.  
  3054. //  printf("conf.win_static_size_x %d\n",conf.win_static_size_x);
  3055. //  printf("conf.win_static_size_y %d\n",conf.win_static_size_y);
  3056.  
  3057.     //-------------------------------------------------------------------------
  3058.     RECT current_main_wnd_size;
  3059.     GetClientRect( wnd, &current_main_wnd_size);
  3060.     int current_main_wnd_size_x = current_main_wnd_size.right -  current_main_wnd_size.left;
  3061.     int current_main_wnd_size_y = current_main_wnd_size.bottom - current_main_wnd_size.top;
  3062.     //-------------------------------------------------------------------------
  3063.     if (preserve_size)
  3064.     {
  3065.         //printf( "try to preserve size\n");
  3066.     }
  3067.     //-------------------------------------------------------------------------
  3068.  
  3069. //   printf("%s\n", __FUNCTION__);
  3070.     //-------------------------------------------------------------------------
  3071.     if (pal)
  3072.     {
  3073.         pal->Release();
  3074.         pal = nullptr;
  3075.     }
  3076.     //-------------------------------------------------------------------------
  3077.     if (surf2)
  3078.     {
  3079.         surf2->Release();
  3080.         surf2 = nullptr;
  3081.     }
  3082.     //-------------------------------------------------------------------------
  3083.     if (surf1)
  3084.     {
  3085.         surf1->Release();
  3086.         surf1 = nullptr;
  3087.     }
  3088.     //-------------------------------------------------------------------------
  3089.     if (surf0)
  3090.     {
  3091.         ULONG RefCnt = surf0->Release();
  3092.         //---------------------------------------------------------------------
  3093.         if (RefCnt != 0)
  3094.         {
  3095.             printf("surf0->Release(), RefCnt=%lu\n", RefCnt);
  3096.             exit();
  3097.         }
  3098.         //---------------------------------------------------------------------
  3099.         surf0 = nullptr;
  3100.     }
  3101.     //-------------------------------------------------------------------------
  3102.     if (sprim)  //OVERLAY??
  3103.     {
  3104.         sprim->Release();
  3105.         sprim = nullptr;
  3106.     }
  3107.     //-------------------------------------------------------------------------
  3108.     if (clip)
  3109.     {
  3110.         clip->Release();
  3111.         clip = nullptr;
  3112.     }
  3113.     //-------------------------------------------------------------------------
  3114.     if (SurfTexture)
  3115.     {
  3116.         SurfTexture->Release();
  3117.         SurfTexture = nullptr;
  3118.     }
  3119.     //-------------------------------------------------------------------------
  3120.     if (Texture)
  3121.     {
  3122.         ULONG RefCnt = Texture->Release();
  3123.         (void) RefCnt;
  3124.        
  3125. #ifdef _DEBUG //---------------------------------------------------------------
  3126.         if (RefCnt != 0)
  3127.         {
  3128.             __debugbreak();
  3129.         }
  3130. #endif //----------------------------------------------------------------------
  3131.  
  3132.         Texture = nullptr;
  3133.     }
  3134.     //-------------------------------------------------------------------------
  3135.     HRESULT r;
  3136.  
  3137.     DDSURFACEDESC desc;
  3138.     desc.dwSize = sizeof desc;
  3139.     r = dd->GetDisplayMode( &desc);
  3140.     //-------------------------------------------------------------------------
  3141.     if (r != DD_OK)
  3142.     {
  3143.         printrdd("IDirectDraw2::GetDisplayMode()", r);
  3144.         exit();
  3145.     }
  3146.     //-------------------------------------------------------------------------
  3147.     temp.ofq = desc.dwRefreshRate; // nt only?
  3148.     if (!temp.ofq)
  3149.         temp.ofq = conf.refresh;
  3150.     //-------------------------------------------------------------------------
  3151.     // ╧ЁютхЁър эрышўш  hw overlay
  3152.     if (drivers[ conf.driver].flags & RF_OVR)
  3153.     {
  3154.         DDCAPS Caps;
  3155.         Caps.dwSize = sizeof( Caps);
  3156.         //---------------------------------------------------------------------
  3157.         if ((r = dd->GetCaps( &Caps, nullptr)) == DD_OK)
  3158.         {
  3159.             if (Caps.dwMaxVisibleOverlays == 0)
  3160.             {
  3161.                 errexit("HW Overlay not supported");
  3162.             }
  3163.         }
  3164.         //---------------------------------------------------------------------
  3165.     }
  3166.     //-------------------------------------------------------------------------
  3167.     // select fullscreen, set window style
  3168.     if (temp.rflags & RF_DRIVER)
  3169.         temp.rflags |= drivers[ conf.driver].flags;
  3170.     //-------------------------------------------------------------------------
  3171.     // fullscreen фы  Ёхцшьют эх яюффхЁцштр■∙шї window mode
  3172.     if (!(temp.rflags & ( RF_GDI  |
  3173.                           RF_OVR  |
  3174.                           RF_CLIP |
  3175.                           RF_D3D
  3176.                         ))
  3177.      )
  3178.     {
  3179.          conf.fullscr = 1;
  3180.     }
  3181.     //-------------------------------------------------------------------------
  3182.     if ((temp.rflags & RF_32) && (desc.ddpfPixelFormat.dwRGBBitCount != 32))
  3183.         conf.fullscr = 1; // for chunks via blitter
  3184.     //-------------------------------------------------------------------------
  3185.     static RECT rc;
  3186.     LONG oldstyle = GetWindowLong( wnd, GWL_STYLE);
  3187.     //-------------------------------------------------------------------------
  3188.     if (oldstyle & WS_CAPTION)
  3189.         GetWindowRect( wnd, &rc);
  3190.     //-------------------------------------------------------------------------
  3191.     LONG style = LONG( conf.fullscr  ?  (WS_VISIBLE | WS_POPUP) :
  3192.                                         (WS_VISIBLE | WS_OVERLAPPEDWINDOW));
  3193.     //-------------------------------------------------------------------------
  3194.     if ((oldstyle ^ style) & WS_CAPTION)
  3195.     {
  3196. //      printf("set style=%X, fullscr=%d\n", style, conf.fullscr);
  3197.         SetWindowLong( wnd, GWL_STYLE, style);
  3198.     }
  3199.     //-------------------------------------------------------------------------
  3200.     // select exclusive
  3201.     u8 excl = conf.fullscr;
  3202.     //-------------------------------------------------------------------------
  3203.     if ((temp.rflags & RF_CLIP) && (desc.ddpfPixelFormat.dwRGBBitCount == 8))
  3204.         excl = 1;
  3205.     //-------------------------------------------------------------------------
  3206.     if (!(temp.rflags & (RF_MON | RF_D3D | RF_D3DE)))
  3207.     {
  3208.         r = dd->SetCooperativeLevel( wnd, excl  ?  DDSCL_ALLOWREBOOT | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN :
  3209.                                                    DDSCL_ALLOWREBOOT | DDSCL_NORMAL);
  3210.         if (r != DD_OK)
  3211.         {
  3212.             printrdd("IDirectDraw2::SetCooperativeLevel()", r);
  3213.             exit();
  3214.         }
  3215.     }
  3216.     //-------------------------------------------------------------------------
  3217. //      temp.b_left = (((conf.paper % conf.t_line) & 0x07 ) == 0)   ?   (conf.paper % conf.t_line)              :
  3218. //                                                                      (((conf.paper % conf.t_line) | 0x07)+1) ;
  3219.  
  3220.  
  3221. // border full - Єъ ЁрчьхЁ√ яю X эєцэ√ ъЁрЄэ√х 8
  3222. // Єю эхы№ч  юЄюсЁрчшЄ№ яЁртшы№э√щ ЁрчьхЁ
  3223. // фюсрты   ёыхтр юЄ·хфрхЄёю ўрёЄ№ шчюсЁрцхэш  ёяЁртр
  3224. // яю¤Єюьє шчюсЁрцхэшх чрфрхЄёю ё чрярёюь ёю тёхї ёЄюЁюэ
  3225. // ш тшфэю ьєёюЁ
  3226. // ьюцхЄ тсєфєї∙хь эхтрышфэр  ўрёЄ№ сєфхЄ чрЄшЁрЄёю яютхЁї
  3227. // Єръ цх 16ё Ёхцшь√ Ёшёє■Є ьшью !!!!!!111
  3228.                
  3229.     //-------------------------------------------------------------------------        
  3230.     // select resolution
  3231.     const unsigned size_x[4] = { 256U,
  3232.                                  conf.mcx_small,
  3233.                                  conf.mcx_full,
  3234.                                  512    //(((conf.t_line * 2) & 0x07 ) == 0)  ? ((conf.t_line * 2) + 8)          :
  3235.                                         //                                      (((conf.t_line * 2) | 0x07) + 9)
  3236.                                         //                              // full X mode
  3237.                                };
  3238.     const unsigned size_y[4] = { 192U,
  3239.                                  conf.mcy_small,
  3240.                                  conf.mcy_full,
  3241.                                  324                    // full y mode
  3242.                               };
  3243.     //-------------------------------------------------------------------------
  3244.     // фюёЄрхь шч уюЄютюую эрсюЁр ЁрчьхЁют
  3245.     temp.ox = temp.scx = size_x[ conf.bordersize];
  3246.     temp.oy = temp.scy = size_y[ conf.bordersize];
  3247.     //-------------------------------------------------------------------------
  3248. //      printf("temp.ox %d\n",temp.ox);
  3249. //      printf("temp.oy %d\n",temp.oy);
  3250.  
  3251.     //-------------------------------------------------------------------------
  3252.     if (temp.rflags & RF_2X)
  3253.     {
  3254.         temp.ox *= 2;
  3255.         temp.oy *= 2;
  3256.         //---------------------------------------------------------------------
  3257.         if (    conf.fast_sl                            &&
  3258.                 (temp.rflags & RF_DRIVER)               &&
  3259.                 (temp.rflags & (RF_CLIP | RF_OVR))
  3260.          )
  3261.         {
  3262.             temp.oy /= 2;
  3263.         }
  3264.         //---------------------------------------------------------------------
  3265.     }
  3266.     //-------------------------------------------------------------------------
  3267.     //RF_* - video filter!!!
  3268.     //р х∙х хёЄ№ winscale ъюЄюЁ√щ ЁрсюЄрхЄ яютхЁї ш ъюЄюЁ√щ эх тыш хЄ эр ЁрчьхЁ фхсрухЁр!!!!
  3269.     //ъюЄюЁ√щ чютхЄёю ЄєЄ  temp.scale
  3270.     if (temp.rflags & RF_3X)            { temp.ox *= 3;         temp.oy *= 3; }
  3271.     if (temp.rflags & RF_4X)            { temp.ox *= 4;         temp.oy *= 4; }
  3272.     if (temp.rflags & RF_64x48)         { temp.ox = 64;         temp.oy = 48; }
  3273.     if (temp.rflags & RF_128x96)        { temp.ox = 128;        temp.oy = 96; }
  3274.  
  3275. //      printf("temp.ox %d\n",temp.ox);
  3276. //      printf("temp.oy %d\n",temp.oy);
  3277. //      printf("temp.scale %d\n",temp.scale);
  3278. //      printf("temp.mon_scale %d\n",temp.mon_scale);
  3279.        
  3280.    //фхсрухЁ
  3281. //   if (temp.rflags & RF_MON) { temp.ox = 640; temp.oy = 480; }
  3282.  
  3283. //NS
  3284. //    if (temp.rflags & RF_MON)
  3285. //    {
  3286. //      if      (temp.rflags & RF_2X)   { temp.ox = 640; temp.oy = 480; }       //RF_2X
  3287. //      else if (temp.rflags & RF_3X)   { temp.ox = 1280; temp.oy = 640; }      //RF_3X
  3288. //      else                            { temp.ox = 320; temp.oy = 240; }       //RF_1X
  3289. //    }
  3290.    
  3291.     //-------------------------------------------------------------------------
  3292.     if (temp.rflags & RF_MON)
  3293.     {                                   //фхсрухЁ ёЄртшЄ temp.scale = 1 !!!!
  3294.         temp.ox *= temp.mon_scale;      //р ЄюЄ Ёхёрщч ўЄю фхырхЄ temp.scale
  3295.         temp.oy *= temp.mon_scale;      //эх ЁрсюЄрхЄ т gdi Ёхцшьх фхсрухЁр
  3296.     }                                   //фр ш ¤ьєы  Єюц√...
  3297.     //-------------------------------------------------------------------------                
  3298.  
  3299. /*
  3300.         // Єръ ъЁЁр°шЄёю
  3301.         if ((preserve_size) && (!conf.fullscr))
  3302.         {
  3303.         temp.ox = current_main_wnd_size_x;
  3304.         temp.oy = current_main_wnd_size_y;
  3305.         printf("current_main_wnd_size_x %d\n",current_main_wnd_size_x);
  3306.         printf("current_main_wnd_size_y %d\n",current_main_wnd_size_y);
  3307.         }
  3308. */
  3309.         /*
  3310.         if ((preserve_size) && (!conf.fullscr))
  3311.         {
  3312.         temp.scx = current_main_wnd_size_x;
  3313.         temp.scy = current_main_wnd_size_y;
  3314.         printf("current_main_wnd_size_x %d\n",current_main_wnd_size_x);
  3315.         printf("current_main_wnd_size_y %d\n",current_main_wnd_size_y);
  3316.         }
  3317.         */
  3318.  
  3319.  
  3320.  
  3321. //ЄєЄ ьюцэю ёфхырЄ№ х∙х ш яЁюшчтюы№э√щ ЁрчьхЁ фхсрухЁр
  3322.  
  3323. //   printf("temp.ox=%d, temp.oy=%d\n", temp.ox, temp.oy);
  3324.  
  3325.    // select color depth
  3326.     temp.obpp = 8;
  3327.     //-------------------------------------------------------------------------
  3328.     if (temp.rflags & (RF_CLIP | RF_D3D | RF_D3DE))
  3329.         temp.obpp = desc.ddpfPixelFormat.dwRGBBitCount;
  3330.     //-------------------------------------------------------------------------
  3331.     if (temp.rflags & (RF_16 | RF_OVR))
  3332.         temp.obpp = 16;
  3333.     //-------------------------------------------------------------------------
  3334.     if (temp.rflags & RF_32)
  3335.         temp.obpp = 32;
  3336.     //-------------------------------------------------------------------------
  3337.     if ((temp.rflags & (RF_GDI|RF_8BPCH)) == (RF_GDI|RF_8BPCH))
  3338.         temp.obpp = 32;
  3339.     //-------------------------------------------------------------------------
  3340.     // Full screen
  3341.     if (conf.fullscr || ((temp.rflags & RF_MON) && desc.dwHeight < 480))
  3342.     {
  3343.         // select minimal screen mode
  3344.         unsigned newx = 100000;
  3345.         unsigned newy = 100000;
  3346.         unsigned newfq = conf.refresh  ?  conf.refresh :
  3347.                                           temp.ofq;
  3348.         unsigned newb = temp.obpp;
  3349.         unsigned minx = temp.ox;
  3350.         unsigned miny = temp.oy;
  3351.         unsigned needb = temp.obpp;
  3352.         //---------------------------------------------------------------------
  3353.         if (temp.rflags & (RF_64x48 | RF_128x96))
  3354.         {
  3355.             needb = (temp.rflags & RF_16)  ?  16:
  3356.                                               32;
  3357.                                              
  3358.             minx = desc.dwWidth;  if (minx < 640) minx = 640;
  3359.             miny = desc.dwHeight; if (miny < 480) miny = 480;
  3360.         }
  3361.         //---------------------------------------------------------------------
  3362.         // if (temp.rflags & RF_MON) // - ox=640, oy=480 - set above
  3363.         //---------------------------------------------------------------------
  3364.         for (unsigned i = 0;    i < max_modes;    i++)
  3365.         {
  3366.             //-----------------------------------------------------------------
  3367.             if (modes[i].y < miny || modes[i].x < minx)
  3368.                 continue;
  3369.             //-----------------------------------------------------------------
  3370.             if (!(temp.rflags & RF_MON) && modes[i].b != temp.obpp)
  3371.                 continue;
  3372.             //-----------------------------------------------------------------
  3373.             if (modes[i].y < conf.minres)
  3374.                 continue;
  3375.             //-----------------------------------------------------------------
  3376.             if (        (modes[i].x < newx || modes[i].y < newy)        &&
  3377.                         (!conf.refresh || (modes[i].f == newfq))
  3378.               )
  3379.             {
  3380.                 newx = modes[i].x;
  3381.                 newy = modes[i].y;
  3382.                 if (!conf.refresh && modes[i].f > newfq)
  3383.                     newfq = modes[i].f;
  3384.             }
  3385.             //-----------------------------------------------------------------
  3386.         }
  3387.         //---------------------------------------------------------------------
  3388.         if (newx == 100000)
  3389.         {
  3390.             color( CONSCLR_ERROR);
  3391.             printf("can't find situable mode for %u x %u * %u bits\n", temp.ox, temp.oy, temp.obpp);
  3392.             exit();
  3393.         }
  3394.         //---------------------------------------------------------------------
  3395.         // use minimal or current mode
  3396.         if (temp.rflags & (RF_OVR | RF_GDI | RF_CLIP | RF_D3D | RF_D3DE))
  3397.         {
  3398.             //-----------------------------------------------------------------
  3399.             // leave screen size, if enough width/height
  3400.             newx = desc.dwWidth;
  3401.             newy = desc.dwHeight;
  3402.             //-----------------------------------------------------------------
  3403.             if (newx < minx || newy < miny)
  3404.             {
  3405.                 newx = minx;
  3406.                 newy = miny;
  3407.             }
  3408.             //-----------------------------------------------------------------
  3409.             // leave color depth, until specified directly
  3410.             if (!(temp.rflags & (RF_16 | RF_32)))
  3411.                 newb = desc.ddpfPixelFormat.dwRGBBitCount;
  3412.             //-----------------------------------------------------------------
  3413.         }
  3414.         //---------------------------------------------------------------------
  3415.         if (    (desc.dwWidth != newx)                          ||
  3416.                 (desc.dwHeight != newy)                         ||
  3417.                 (temp.ofq != newfq)                             ||
  3418.                 (desc.ddpfPixelFormat.dwRGBBitCount != newb)
  3419.           )
  3420.         {
  3421. //          printf("SetDisplayMode:%ux%u %uHz\n", newx, newy, newfq);
  3422.             //-----------------------------------------------------------------
  3423.             if ((r = dd->SetDisplayMode( newx, newy, newb, newfq, 0)) != DD_OK)
  3424.             {
  3425.                 printrdd("IDirectDraw2::SetDisplayMode()", r);
  3426.                 exit();
  3427.             }
  3428.             //-----------------------------------------------------------------
  3429.             GetSystemPaletteEntries( temp.gdidc, 0, 0x100, syspalette);
  3430.             //-----------------------------------------------------------------
  3431.             if (newfq)
  3432.                 temp.ofq = newfq;
  3433.             //-----------------------------------------------------------------
  3434.             NeedRestoreDisplayMode = true;
  3435.         }
  3436.         //---------------------------------------------------------------------
  3437.         temp.odx = temp.obpp * (newx - temp.ox) / 16;
  3438.         temp.ody = (newy - temp.oy) / 2;
  3439.         temp.rsx = newx;
  3440.         temp.rsy = newy;
  3441. //      printf("vmode=%ux%u %uHz\n", newx, newy, newfq);
  3442. //      ShowWindow(wnd, SW_SHOWMAXIMIZED);
  3443.         printf("SetWindowPos(%p, HWND_TOPMOST, 0, 0, %u, %u)\n", wnd, newx, newy);
  3444.         //---------------------------------------------------------------------
  3445.         //їч ъюуфр
  3446.         if (!SetWindowPos(      wnd,                    // ╙ёЄрэютър WS_EX_TOPMOST
  3447.                                 HWND_TOPMOST,
  3448.                                 0,
  3449.                                 0,
  3450.                                 int( newx),
  3451.                                 int( newy),
  3452.                                 0
  3453.           ))
  3454.         {
  3455.             __debugbreak();
  3456.         }
  3457.         //---------------------------------------------------------------------
  3458.     }
  3459.     //-------------------------------------------------------------------------
  3460.     // Windowed
  3461.     else
  3462.     {
  3463.         //---------------------------------------------------------------------
  3464.         // ┬юёёЄрэютыхэшх яЁхф√фє∙хую тшфхюЁхцшьр яЁш тючтЁрЄх шч fullscreen (хёыш с√ыр яхЁхєёЄрэютър тшфхюЁхцшьр)
  3465.         if (NeedRestoreDisplayMode)
  3466.         {
  3467.             if ((r = dd->RestoreDisplayMode()) != DD_OK)
  3468.             {
  3469.                 printrdd("IDirectDraw2::SetDisplayMode()", r);
  3470.                 exit();
  3471.             }
  3472.             NeedRestoreDisplayMode = false;
  3473.         }
  3474.         //---------------------------------------------------------------------
  3475.         // restore window position to last saved position in non-fullscreen mode
  3476.         ShowWindow( wnd, SW_SHOWNORMAL);
  3477.         //---------------------------------------------------------------------
  3478.         if (temp.rflags & RF_GDI)
  3479.         {
  3480.             RECT client;
  3481.             if (preserve_size)
  3482.             {
  3483.                 RECT client =
  3484.                 {
  3485.                     0,
  3486.                     0,
  3487.                     LONG( current_main_wnd_size_x),
  3488.                     LONG( current_main_wnd_size_y)
  3489.                 };    
  3490.             }
  3491.             else
  3492.             {
  3493.             RECT client =
  3494.             {
  3495.                 0,
  3496.                 0,
  3497.                 LONG( temp.ox),
  3498.                 LONG( temp.oy)
  3499.             };    
  3500.             }
  3501.             AdjustWindowRect( &client, WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0);
  3502.             rc.right = rc.left + (client.right - client.left);
  3503.             rc.bottom = rc.top + (client.bottom - client.top);
  3504.         }
  3505.         //---------------------------------------------------------------------
  3506.  
  3507.  
  3508.    //-------------------------------------------------------------------------
  3509.         /*
  3510.         // эєцхэ яЁш тючтЁрЄх шч ЇєыыёъЁшэр
  3511.         // ўЄюс юъэю юърч√трыюё№ Єрь уфх эрфю
  3512.         // ═╬ яЁштюфшЄ ъ ьхЁчёъюьє фхЁуюёь√ърэш■ яЁш тїюфх т фхсрухЁ
  3513.         MoveWindow(     wnd,
  3514.                         rc.left,
  3515.                         rc.top,
  3516.                         rc.right - rc.left,
  3517.                         rc.bottom - rc.top,
  3518.                         1
  3519.                    );
  3520.         */
  3521.     }
  3522.     //-------------------------------------------------------------------------
  3523.     if (!(temp.rflags & (RF_D3D | RF_D3DE)))
  3524.     {
  3525.         dd->FlipToGDISurface(); // don't check result
  3526.     }
  3527.     //-------------------------------------------------------------------------
  3528.     desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
  3529.     desc.dwFlags = DDSD_CAPS;
  3530.  
  3531.     DWORD pl[ 0x101];
  3532.     pl[0] = 0x01000300;
  3533.     memcpy( pl+1, pal0, 0x400);
  3534.     HPALETTE hpal = CreatePalette( (LOGPALETTE*) &pl);
  3535.     DeleteObject( SelectPalette( temp.gdidc, hpal, 0));
  3536.     RealizePalette( temp.gdidc); // for RF_GDI and for bitmap, used in WM_PAINT
  3537.     //-------------------------------------------------------------------------
  3538.     if (temp.rflags & RF_GDI)
  3539.     {
  3540.         //---------------------------------------------------------------------
  3541.         // Єръ Ёрёъюыср°штрхЄ gdi Ёхцшь
  3542.         // яюър яЁхф√фє∙хх ЁрчЁх°хэшх эх хёЄ№ юЁшушэры№эюх
  3543. //      if (preserve_size)
  3544. //      {
  3545. //          gdibmp.header.bmiHeader.biWidth = LONG( current_main_wnd_size_x);
  3546. //          gdibmp.header.bmiHeader.biHeight = -LONG( current_main_wnd_size_y);
  3547. //      }
  3548. //      //---------------------------------------------------------------------
  3549. //      else
  3550. //      {
  3551.             gdibmp.header.bmiHeader.biWidth = LONG( temp.ox);
  3552.             gdibmp.header.bmiHeader.biHeight = -LONG( temp.oy);
  3553. //      }
  3554.         //---------------------------------------------------------------------
  3555.         gdibmp.header.bmiHeader.biBitCount = WORD( temp.obpp);
  3556.     }
  3557.     //-------------------------------------------------------------------------
  3558.     else if (temp.rflags & RF_OVR)
  3559.     {
  3560.  
  3561.         temp.odx = temp.ody = 0;
  3562.         if ((r = dd->CreateSurface( &desc, &sprim, nullptr)) != DD_OK)
  3563.         {
  3564.             printrdd("IDirectDraw2::CreateSurface() [primary,test]", r);
  3565.             exit();
  3566.         }
  3567.         //---------------------------------------------------------------------
  3568.         desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
  3569.         desc.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY;
  3570.         desc.dwWidth = temp.ox;
  3571.         desc.dwHeight = temp.oy;
  3572.         //---------------------------------------------------------------------
  3573.         // conf.flip = 0;       // overlay always synchronized without Flip()! on radeon videocards
  3574.                                 // double flip causes fps drop
  3575.         //---------------------------------------------------------------------
  3576.         if (conf.flip)
  3577.         {
  3578.             desc.dwBackBufferCount = 1;
  3579.             desc.dwFlags |= DDSD_BACKBUFFERCOUNT;
  3580.             desc.ddsCaps.dwCaps |= DDSCAPS_FLIP | DDSCAPS_COMPLEX;
  3581.         }
  3582.         //---------------------------------------------------------------------
  3583.         static DDPIXELFORMAT ddpfOverlayFormat16 =
  3584.         {
  3585.             sizeof( DDPIXELFORMAT),
  3586.             DDPF_RGB,
  3587.             0,
  3588.             {16},
  3589.             {0xF800},
  3590.             {0x07E0},
  3591.             {0x001F},
  3592.             {0}
  3593.         };
  3594.         //---------------------------------------------------------------------
  3595.         static DDPIXELFORMAT ddpfOverlayFormat15 =
  3596.         {
  3597.             sizeof( DDPIXELFORMAT),
  3598.             DDPF_RGB,
  3599.             0,
  3600.             {16},
  3601.             {0x7C00},
  3602.             {0x03E0},
  3603.             {0x001F},
  3604.             {0}
  3605.         };
  3606.         //---------------------------------------------------------------------
  3607.         static DDPIXELFORMAT ddpfOverlayFormatYUY2 =
  3608.         {
  3609.             sizeof( DDPIXELFORMAT),
  3610.             DDPF_FOURCC,
  3611.             MAKEFOURCC( 'Y','U','Y','2'),
  3612.             {0},
  3613.             {0},
  3614.             {0},
  3615.             {0},
  3616.             {0}
  3617.         };
  3618.         //---------------------------------------------------------------------
  3619.         if (temp.rflags & RF_YUY2)
  3620.             goto YUY2;
  3621.         //---------------------------------------------------------------------
  3622.         temp.hi15 = 0;
  3623.         desc.ddpfPixelFormat = ddpfOverlayFormat16;
  3624.         r = dd->CreateSurface( &desc, &surf0, nullptr);
  3625.         //---------------------------------------------------------------------
  3626.         if (r == DDERR_INVALIDPIXELFORMAT)
  3627.         {
  3628.             temp.hi15 = 1;
  3629.             desc.ddpfPixelFormat = ddpfOverlayFormat15;
  3630.             r = dd->CreateSurface( &desc, &surf0, nullptr);
  3631.         }
  3632.         //---------------------------------------------------------------------
  3633.         if (r == DDERR_INVALIDPIXELFORMAT /*&& !(temp.rflags & RF_RGB)*/)
  3634.         {
  3635. YUY2:
  3636.             temp.hi15 = 2;
  3637.             desc.ddpfPixelFormat = ddpfOverlayFormatYUY2;
  3638.             r = dd->CreateSurface( &desc, &surf0, nullptr);
  3639.         }
  3640.         //---------------------------------------------------------------------
  3641.         if (r != DD_OK)
  3642.         {
  3643.             printrdd("IDirectDraw2::CreateSurface() [overlay]", r);
  3644.             exit();
  3645.             //r = DDERR_OUTOFCAPS - crash
  3646.         }
  3647.         //---------------------------------------------------------------------
  3648.     }
  3649.     //-------------------------------------------------------------------------
  3650.     else if (temp.rflags & (RF_D3D | RF_D3DE)) // d3d windowed, d3d full screen exclusive
  3651.     {
  3652. //      printf("%s(RF_D3D)\n", __FUNCTION__);
  3653.         // ╤эрўрыр эєцэю юЄьрё°ЄрсшЁютрЄ№ юъэю фю эєцэюую ЁрчьхЁр, р Єюы№ъю яюЄюь єёЄрэртыштрЄ№ тшфхюЁхцшь
  3654.         // Є.ъ. тшфхюЁхцшь юяЁхфхы хЄ ЁрчьхЁ√ back buffer'р шч ЁрчьхЁют юъэр.
  3655.     }
  3656.     //-------------------------------------------------------------------------
  3657.     else  // blt, direct video mem
  3658.     {
  3659. //      desc.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM;
  3660.         //---------------------------------------------------------------------
  3661.         if (conf.flip && !(temp.rflags & RF_CLIP))
  3662.         {
  3663.             desc.dwBackBufferCount = 1;
  3664.             desc.dwFlags |= DDSD_BACKBUFFERCOUNT;
  3665.             desc.ddsCaps.dwCaps |= DDSCAPS_FLIP | DDSCAPS_COMPLEX;
  3666.         }
  3667.         //---------------------------------------------------------------------
  3668.         if ((r = dd->CreateSurface( &desc, &surf0, nullptr)) != DD_OK)
  3669.         {
  3670.             printrdd( "IDirectDraw2::CreateSurface() [primary1]", r);
  3671.             exit();
  3672.         }
  3673.         //---------------------------------------------------------------------
  3674.         if (temp.rflags & RF_CLIP)
  3675.         {
  3676.             DDSURFACEDESC SurfDesc;
  3677.             SurfDesc.dwSize = sizeof( SurfDesc);
  3678.             //-----------------------------------------------------------------
  3679.             if ((r = surf0->GetSurfaceDesc( &SurfDesc)) != DD_OK)
  3680.             {
  3681.                 printrdd( "IDirectDrawSurface::GetSurfaceDesc()", r);
  3682.                 exit();
  3683.             }
  3684.             //-----------------------------------------------------------------
  3685.             desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
  3686.             desc.dwWidth = SurfDesc.dwWidth;
  3687.             desc.dwHeight = SurfDesc.dwHeight;
  3688.             desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM;
  3689.             //-----------------------------------------------------------------
  3690.             if ((r = dd->CreateSurface( &desc, &surf2, nullptr)) != DD_OK)
  3691.             {
  3692.                 printrdd( "IDirectDraw2::CreateSurface() [2]", r);
  3693.                 exit();
  3694.             }
  3695.             //-----------------------------------------------------------------
  3696.             r = dd->CreateClipper( 0, &clip, nullptr);
  3697.            
  3698.             if (r != DD_OK)
  3699.             {
  3700.                 printrdd( "IDirectDraw2::CreateClipper()", r);
  3701.                 exit();
  3702.             }
  3703.             //-----------------------------------------------------------------
  3704.             r = clip->SetHWnd( 0, wnd);
  3705.            
  3706.             if (r != DD_OK)
  3707.             {
  3708.                 printrdd( "IDirectDraw2::SetHWnd()", r);
  3709.                 exit();
  3710.             }
  3711.             //-----------------------------------------------------------------
  3712.             r = surf0->SetClipper( clip);
  3713.            
  3714.             if (r != DD_OK)
  3715.             {
  3716.                 printrdd("surf0, IDirectDrawSurface2::SetClipper()", r);
  3717.                 exit();
  3718.             }
  3719.             //-----------------------------------------------------------------
  3720.             r = surf2->SetClipper( clip);
  3721.          
  3722.             if (r != DD_OK)
  3723.             {
  3724.                 printrdd("surf2, IDirectDrawSurface2::SetClipper()", r);
  3725.                 exit();
  3726.             }
  3727.             //-----------------------------------------------------------------
  3728.             r = dd->GetDisplayMode( &desc);
  3729.            
  3730.             if (r != DD_OK)
  3731.             {
  3732.                 printrdd("IDirectDraw2::GetDisplayMode()", r);
  3733.                 exit();
  3734.             }
  3735.             //-----------------------------------------------------------------
  3736.             if ((temp.rflags & RF_32) && (desc.ddpfPixelFormat.dwRGBBitCount != 32))
  3737.                 errexit( "video driver requires 32bit color depth on desktop for this mode");
  3738.             //-----------------------------------------------------------------
  3739.             desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
  3740.             desc.dwWidth = temp.ox;
  3741.             desc.dwHeight = temp.oy;
  3742.  
  3743.             // ┬шфхюърЁЄ√ AMD Radeon HD эх яюффхЁцштр■Є surface т ёшёЄхьэющ ярь Єш
  3744.             // шч чр ¤Єюую яЁшїюфшЄё  юЄфхы№э√щ сєЇхЁ т ёшёЄхьэю ярь Єш ш фхырЄ№ яЁюуЁрььэюх
  3745.             // ъюяшЁютрэшх т surface т√фхыхээ√щ т тшфхюярь Єш шэрўх эшъръ эх чрфрЄ№ т√Ёртэштрэшх эр 16 срщЄ
  3746.             desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM;
  3747.  
  3748. #ifdef MOD_SSE2
  3749.             //-----------------------------------------------------------------
  3750.             //if (!(renders[conf.render].flags & 0))    // тёх тЁхь  ЁрсюЄрыю ъръ
  3751.             if (!(renders[ conf.render].flags & RF_1X)) // хёыш эх RF_1X
  3752.             {
  3753.                 //printf("SSE2\n");
  3754.                 SurfPitch1 = (temp.ox * temp.obpp) >> 3;
  3755.                 SurfPitch1 = (SurfPitch1 + 15) & ~15U; // ┬√Ёртэштрэшх эр 16
  3756.                 //-------------------------------------------------------------
  3757.                 if (SurfMem1)
  3758.                     _aligned_free( SurfMem1);
  3759.                 //-------------------------------------------------------------
  3760.                 SurfMem1 = _aligned_malloc( SurfPitch1 * temp.oy, 16);
  3761.                 FlipBltMethod = FlipBltAlign16;
  3762.             }
  3763.             //-----------------------------------------------------------------
  3764.             else
  3765. #endif
  3766.             {
  3767.                 //printf("not SSE2\n");
  3768.                 FlipBltMethod = FlipBltAlign4;
  3769.             }
  3770.             //-----------------------------------------------------------------
  3771.             r = dd->CreateSurface( &desc, &surf1, nullptr);
  3772.             if (r != DD_OK)
  3773.             {
  3774.                 printrdd("IDirectDraw2::CreateSurface()", r);
  3775.                 exit();
  3776.             }
  3777.             //-----------------------------------------------------------------
  3778.         }
  3779.         //---------------------------------------------------------------------
  3780.         if (temp.obpp == 16)
  3781.         {
  3782.             DDPIXELFORMAT fm;
  3783.             fm.dwSize = sizeof fm;
  3784.             //-----------------------------------------------------------------
  3785.             if ((r = surf0->GetPixelFormat( &fm)) != DD_OK)
  3786.             {
  3787.                 printrdd( "IDirectDrawSurface2::GetPixelFormat()", r);
  3788.                 exit();
  3789.             }
  3790.             //-----------------------------------------------------------------
  3791.             if (        (fm.dwRBitMask == 0xF800)       &&
  3792.                         (fm.dwGBitMask == 0x07E0)       &&
  3793.                         (fm.dwBBitMask == 0x001F)
  3794.               )
  3795.             {
  3796.                 temp.hi15 = 0;
  3797.             }
  3798.             //-----------------------------------------------------------------
  3799.             else if (   (fm.dwRBitMask == 0x7C00)       &&
  3800.                         (fm.dwGBitMask == 0x03E0)       &&
  3801.                         (fm.dwBBitMask == 0x001F)
  3802.               )
  3803.             {
  3804.                 temp.hi15 = 1;
  3805.             }
  3806.             //-----------------------------------------------------------------
  3807.             else
  3808.             {
  3809.                 errexit( "invalid pixel format (need RGB:5-6-5 or URGB:1-5-5-5)");
  3810.             }
  3811.             //-----------------------------------------------------------------
  3812.         }
  3813.         //---------------------------------------------------------------------
  3814.         else if (temp.obpp == 8)
  3815.         {
  3816.             //-----------------------------------------------------------------
  3817.             if ((r = dd->CreatePalette( DDPCAPS_8BIT | DDPCAPS_ALLOW256, syspalette, &pal, nullptr)) != DD_OK)
  3818.             {
  3819.                 printrdd( "IDirectDraw2::CreatePalette()", r);
  3820.                 exit();
  3821.             }
  3822.             //-----------------------------------------------------------------
  3823.             if ((r = surf0->SetPalette( pal)) != DD_OK)
  3824.             {
  3825.                 printrdd( "IDirectDrawSurface2::SetPalette()", r);
  3826.                 exit();
  3827.             }
  3828.             //-----------------------------------------------------------------
  3829.         }
  3830.         //---------------------------------------------------------------------
  3831.     }
  3832.     //-------------------------------------------------------------------------
  3833.     if (conf.flip && !(temp.rflags & (RF_GDI|RF_CLIP|RF_D3D|RF_D3DE)))
  3834.     {
  3835.         DDSCAPS caps = { DDSCAPS_BACKBUFFER };
  3836.         //---------------------------------------------------------------------
  3837.         if ((r = surf0->GetAttachedSurface( &caps, &surf1)) != DD_OK)
  3838.         {
  3839.             printrdd( "IDirectDraw2::GetAttachedSurface()", r);
  3840.             exit();
  3841.         }
  3842.         //---------------------------------------------------------------------
  3843.     }
  3844.     //-------------------------------------------------------------------------
  3845.     // ═рёЄЁрштрхь ЇєэъЎш■ ъюэтхЁЄшЁютрэш  шч Єхъє∙хую ЇюЁьрЄр т BGR24
  3846.     switch (temp.obpp)
  3847.     {
  3848.         //---------------------------------------------------------------------
  3849.         case 8:
  3850.             ConvBgr24 = ConvPal8ToBgr24;
  3851.             break;
  3852.         //---------------------------------------------------------------------
  3853.         case 16:
  3854.             //-----------------------------------------------------------------
  3855.             switch (temp.hi15)
  3856.             {
  3857.                 //-------------------------------------------------------------
  3858.                 case 0: ConvBgr24 = ConvRgb16ToBgr24;   // RGB16
  3859.                     break;
  3860.                 //-------------------------------------------------------------
  3861.                 case 1: ConvBgr24 = ConvRgb15ToBgr24;   // RGB15
  3862.                     break;
  3863.                 //-------------------------------------------------------------
  3864.                 case 2: ConvBgr24 = ConvYuy2ToBgr24;    // YUY2
  3865.                     break;
  3866.                 //-------------------------------------------------------------
  3867.             }
  3868.             //-----------------------------------------------------------------
  3869.             break;
  3870.         //---------------------------------------------------------------------
  3871.         case 32:
  3872.             ConvBgr24 = ConvBgr32ToBgr24;
  3873.             break;
  3874.         //---------------------------------------------------------------------
  3875.     }
  3876.     //-------------------------------------------------------------------------
  3877.     SendMessage( wnd, WM_USER, 0, 0); // setup rectangle for RF_GDI,OVR,CLIP, adjust cursor
  3878.     //-------------------------------------------------------------------------
  3879.     // ъюЁхэ№ чыр
  3880.     //if (conf.win_resize_request)      // [NS]
  3881.     if (!preserve_size)
  3882.     {
  3883.         scale_normal();
  3884.         //if (!conf.fullscr)
  3885.         //    scale_normal();
  3886.     }      
  3887.     //-------------------------------------------------------------------------
  3888.     // d3d windowed, d3d full screen exclusive
  3889.     if (temp.rflags & (RF_D3D | RF_D3DE))
  3890.     {
  3891.         // ╤эрўрыр эєцэю юЄьрё°ЄрсшЁютрЄ№ юъэю фю эєцэюую ЁрчьхЁр, р Єюы№ъю яюЄюь єёЄрэртыштрЄ№ тшфхюЁхцшь
  3892.         // Є.ъ. тшфхюЁхцшь юяЁхфхы хЄ ЁрчьхЁ√ back buffer'р шч ЁрчьхЁют юъэр.
  3893.         SetVideoModeD3d( (temp.rflags & RF_D3DE) != 0);
  3894.     }
  3895.     //-------------------------------------------------------------------------
  3896.    
  3897.    
  3898.    
  3899. /*
  3900.     //-------------------------------------------------------------------------
  3901.     if (conf.win_resize_request)
  3902.     {
  3903.         // ёюїЁрэ хь Єхъє∙хх ЁрчЁх°хэшх
  3904.         printf("save size\n");
  3905.         conf.win_static_size_x = temp.ox;
  3906.         conf.win_static_size_y = temp.oy;
  3907.         conf.win_resize_request = 0;
  3908.     }
  3909.     //-------------------------------------------------------------------------
  3910.     else
  3911.     {
  3912.         // шёяюы№чєхь Єхъє∙хх ЁрчЁх°хэшх
  3913.         printf("use static size\n");
  3914.         temp.ox = conf.win_static_size_x;
  3915.         temp.oy = conf.win_static_size_y;
  3916.     }
  3917.     //-------------------------------------------------------------------------    
  3918. */
  3919.    
  3920.    
  3921.    
  3922.    
  3923. }
  3924. //=============================================================================
  3925.  
  3926.  
  3927. //=============================================================================
  3928. static HRESULT SetDIDwordProperty(      LPDIRECTINPUTDEVICE     pdev,
  3929.                                         REFGUID                 guidProperty,
  3930.                                         DWORD           dwObject,
  3931.                                         DWORD           dwHow,
  3932.                                         DWORD           dwValue
  3933.   )
  3934. {
  3935.     DIPROPDWORD dipdw;
  3936.     dipdw.diph.dwSize       = sizeof( dipdw);
  3937.     dipdw.diph.dwHeaderSize = sizeof( dipdw.diph);
  3938.     dipdw.diph.dwObj        = dwObject;
  3939.     dipdw.diph.dwHow        = dwHow;
  3940.     dipdw.dwData            = dwValue;
  3941.     return pdev->SetProperty( guidProperty, &dipdw.diph);
  3942. }
  3943. //=============================================================================
  3944.  
  3945.  
  3946. //=============================================================================
  3947. static BOOL CALLBACK InitJoystickInput(LPCDIDEVICEINSTANCE pdinst, LPVOID pvRef)
  3948. {
  3949.     HRESULT r;
  3950.     LPDIRECTINPUT pdi = (LPDIRECTINPUT)pvRef;
  3951.     LPDIRECTINPUTDEVICE dijoyst1;
  3952.     LPDIRECTINPUTDEVICE2 dijoyst;
  3953.     //-------------------------------------------------------------------------
  3954.     if ((r = pdi->CreateDevice(pdinst->guidInstance, &dijoyst1, nullptr)) != DI_OK)
  3955.     {
  3956.         printrdi("IDirectInput::CreateDevice() (joystick)", r);
  3957.         return DIENUM_CONTINUE;
  3958.     }
  3959.     //-------------------------------------------------------------------------
  3960.     r = dijoyst1->QueryInterface(IID_IDirectInputDevice2, (void**)&dijoyst);
  3961.     if (r != S_OK)
  3962.     {
  3963.         printrdi("IDirectInputDevice::QueryInterface(IID_IDirectInputDevice2) [dx5 not found]", r);
  3964.         dijoyst1->Release();
  3965.         dijoyst1=nullptr;
  3966.         return DIENUM_CONTINUE;
  3967.     }
  3968.     //-------------------------------------------------------------------------
  3969.     dijoyst1->Release();
  3970.  
  3971.     DIDEVICEINSTANCE dide = { sizeof dide };
  3972.     //-------------------------------------------------------------------------
  3973.     if ((r = dijoyst->GetDeviceInfo(&dide)) != DI_OK)
  3974.     {
  3975.         printrdi("IDirectInputDevice::GetDeviceInfo()", r);
  3976.         return DIENUM_STOP;
  3977.     }
  3978.     //-------------------------------------------------------------------------
  3979.     DIDEVCAPS dc = { sizeof dc };
  3980.     //-------------------------------------------------------------------------
  3981.     if ((r = dijoyst->GetCapabilities(&dc)) != DI_OK)
  3982.     {
  3983.         printrdi("IDirectInputDevice::GetCapabilities()", r);
  3984.         return DIENUM_STOP;
  3985.     }
  3986.     //-------------------------------------------------------------------------
  3987.     DIPROPDWORD JoyId;
  3988.     JoyId.diph.dwSize       = sizeof(JoyId);
  3989.     JoyId.diph.dwHeaderSize = sizeof(JoyId.diph);
  3990.     JoyId.diph.dwObj        = 0;
  3991.     JoyId.diph.dwHow        = DIPH_DEVICE;
  3992.    //-------------------------------------------------------------------------
  3993.     if ((r = dijoyst->GetProperty(DIPROP_JOYSTICKID, &JoyId.diph)) != DI_OK)
  3994.     {
  3995.         printrdi("IDirectInputDevice::GetProperty(DIPROP_JOYSTICKID)", r);
  3996.         exit();
  3997.     }
  3998.     //-------------------------------------------------------------------------
  3999.     trim_right( dide.tszInstanceName);
  4000.     trim_right( dide.tszProductName);
  4001.  
  4002.     CharToOem( dide.tszInstanceName, dide.tszInstanceName);
  4003.     CharToOem( dide.tszProductName, dide.tszProductName);
  4004.     //-------------------------------------------------------------------------
  4005.     if (strcmp( dide.tszProductName, dide.tszInstanceName))
  4006.     {
  4007.         strcat( dide.tszInstanceName, ", ");
  4008.     }
  4009.     else
  4010.     {
  4011.         dide.tszInstanceName[0] = 0;
  4012.     }
  4013.     //-------------------------------------------------------------------------
  4014.     bool UseJoy = (JoyId.dwData == conf.input.JoyId);
  4015.     color( CONSCLR_HARDINFO);
  4016.     printf("%cjoy(%lu): %s%s (%lu axes, %lu buttons, %lu POVs)\n",      UseJoy    ?     '*' :
  4017.                                                                                         ' ',
  4018.                                                                         JoyId.dwData,
  4019.                                                                         dide.tszInstanceName,
  4020.                                                                         dide.tszProductName,
  4021.                                                                         dc.dwAxes,
  4022.                                                                         dc.dwButtons,
  4023.                                                                         dc.dwPOVs
  4024.                                                                   );
  4025.  
  4026.     //-------------------------------------------------------------------------
  4027.     if (UseJoy)
  4028.     {
  4029.         //---------------------------------------------------------------------
  4030.         if ((r = dijoyst->SetDataFormat(&c_dfDIJoystick)) != DI_OK)
  4031.         {
  4032.             printrdi("IDirectInputDevice::SetDataFormat() (joystick)", r);
  4033.             exit();
  4034.         }
  4035.         //---------------------------------------------------------------------
  4036.         if ((r = dijoyst->SetCooperativeLevel(wnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND)) != DI_OK)
  4037.         {
  4038.             printrdi("IDirectInputDevice::SetCooperativeLevel() (joystick)", r);
  4039.             exit();
  4040.         }
  4041.         //---------------------------------------------------------------------
  4042.         DIPROPRANGE diprg;
  4043.         diprg.diph.dwSize       = sizeof(diprg);
  4044.         diprg.diph.dwHeaderSize = sizeof(diprg.diph);
  4045.         diprg.diph.dwObj        = DIJOFS_X;
  4046.         diprg.diph.dwHow        = DIPH_BYOFFSET;
  4047.         diprg.lMin              = -1000;
  4048.         diprg.lMax              = +1000;
  4049.         //---------------------------------------------------------------------
  4050.         if ((r = dijoyst->SetProperty(DIPROP_RANGE, &diprg.diph)) != DI_OK)
  4051.         {
  4052.             printrdi("IDirectInputDevice::SetProperty(DIPH_RANGE)", r);
  4053.             exit();
  4054.         }
  4055.         //---------------------------------------------------------------------
  4056.         diprg.diph.dwObj        = DIJOFS_Y;
  4057.         //---------------------------------------------------------------------
  4058.         if ((r = dijoyst->SetProperty(DIPROP_RANGE, &diprg.diph)) != DI_OK)
  4059.         {
  4060.             printrdi("IDirectInputDevice::SetProperty(DIPH_RANGE) (y)", r);
  4061.             exit();
  4062.         }
  4063.         //---------------------------------------------------------------------
  4064.         if ((r = SetDIDwordProperty(dijoyst, DIPROP_DEADZONE, DIJOFS_X, DIPH_BYOFFSET, 2000)) != DI_OK)
  4065.         {
  4066.             printrdi("IDirectInputDevice::SetProperty(DIPH_DEADZONE)", r);
  4067.             exit();
  4068.         }
  4069.         //---------------------------------------------------------------------
  4070.         if ((r = SetDIDwordProperty(dijoyst, DIPROP_DEADZONE, DIJOFS_Y, DIPH_BYOFFSET, 2000)) != DI_OK)
  4071.         {
  4072.             printrdi("IDirectInputDevice::SetProperty(DIPH_DEADZONE) (y)", r);
  4073.             exit();
  4074.         }
  4075.         //---------------------------------------------------------------------
  4076.         ::dijoyst = dijoyst;
  4077.     }
  4078.     //-------------------------------------------------------------------------
  4079.     else
  4080.     {
  4081.         dijoyst->Release();
  4082.     }
  4083.     //-------------------------------------------------------------------------
  4084.     return DIENUM_CONTINUE;
  4085. }
  4086. //=============================================================================
  4087.  
  4088.  
  4089. //=============================================================================
  4090. static HRESULT WINAPI callb(LPDDSURFACEDESC surf, void *lpContext)
  4091. {
  4092.     (void)lpContext;
  4093.  
  4094.     //-------------------------------------------------------------------------
  4095.     if (max_modes >= MAX_MODES)
  4096.         return DDENUMRET_CANCEL;
  4097.     //-------------------------------------------------------------------------
  4098.     modes[max_modes].x = surf->dwWidth;
  4099.     modes[max_modes].y = surf->dwHeight;
  4100.     modes[max_modes].b = surf->ddpfPixelFormat.dwRGBBitCount;
  4101.     modes[max_modes].f = surf->dwRefreshRate;
  4102.     max_modes++;
  4103.     return DDENUMRET_OK;
  4104. }
  4105. //=============================================================================
  4106.  
  4107.  
  4108. //=============================================================================
  4109. void scale_normal()
  4110. {
  4111.     ULONG cmd;
  4112.     //printf("send\n");
  4113.     //-------------------------------------------------------------------------
  4114.     switch (temp.scale)
  4115.     {
  4116.         default:
  4117.         case 1: cmd = SCU_SCALE1; break;
  4118.         case 2: cmd = SCU_SCALE2; break;
  4119.         case 3: cmd = SCU_SCALE3; break;
  4120.         case 4: cmd = SCU_SCALE4; break;
  4121.     }
  4122.     //-------------------------------------------------------------------------
  4123.     SendMessage(wnd, WM_SYSCOMMAND, cmd, 0); // set window size
  4124.    
  4125.     //эє тюЄ р яюЄюь юфшэ тшфхю Ёхцшь єцх тъы■ўхэ
  4126.     //р ъюёЄ√ыш фы  тшфхю Ёхцшьр т хярэющ юўхЁхфш ёююс∙хэшщ...
  4127.    
  4128. }
  4129. //=============================================================================
  4130.  
  4131. #ifdef _DEBUG
  4132. #define D3D_DLL_NAME "d3d9d.dll"
  4133. #else
  4134. #endif
  4135. #define D3D_DLL_NAME "d3d9.dll"
  4136.  
  4137. //=============================================================================
  4138. static void DbgPrint(const char *s)
  4139. {
  4140.     OutputDebugStringA(s);
  4141. }
  4142. //=============================================================================
  4143.  
  4144.  
  4145. //=============================================================================
  4146. static void StartD3d(HWND Wnd)
  4147. {
  4148.     (void)Wnd;
  4149.  
  4150. /*
  4151. #if 0 //-----------------------------------------------------------------------
  4152.     OutputDebugString(__FUNCTION__"\n");
  4153.     printf("%s\n", __FUNCTION__);
  4154. #endif //----------------------------------------------------------------------
  4155. */
  4156.     //-------------------------------------------------------------------------
  4157.     if (!D3d9Dll)
  4158.     {
  4159.         D3d9Dll = LoadLibrary(D3D_DLL_NAME);
  4160.         //---------------------------------------------------------------------
  4161.         if (!D3d9Dll)
  4162.         {
  4163.             errexit("unable load d3d9.dll");
  4164.         }
  4165.         //---------------------------------------------------------------------
  4166.     }
  4167.     //-------------------------------------------------------------------------
  4168.     if (!D3d9)
  4169.     {
  4170.         typedef IDirect3D9 * (WINAPI *TDirect3DCreate9)(UINT SDKVersion);
  4171.         TDirect3DCreate9 Direct3DCreate9 = (TDirect3DCreate9) GetProcAddress( D3d9Dll, "Direct3DCreate9");
  4172.         D3d9 = Direct3DCreate9( D3D_SDK_VERSION);
  4173.     }
  4174.     //-------------------------------------------------------------------------
  4175. }
  4176. //=============================================================================
  4177.  
  4178.  
  4179. //=============================================================================
  4180. static void CalcWindowSize()
  4181. {
  4182.         //printf("CalcWindowSize\n");
  4183.     temp.rflags = renders[conf.render].flags;
  4184.     //-------------------------------------------------------------------------
  4185.     if (renders[conf.render].func == render_advmame)
  4186.     {
  4187.         //-------------------------------------------------------------------------
  4188.         if (conf.videoscale == 2)
  4189.             temp.rflags |= RF_2X;
  4190.         //-------------------------------------------------------------------------
  4191.         if (conf.videoscale == 3)
  4192.             temp.rflags |= RF_3X;
  4193.         //-------------------------------------------------------------------------
  4194.         if (conf.videoscale == 4)
  4195.             temp.rflags |= RF_4X;
  4196.         //-------------------------------------------------------------------------
  4197.     }
  4198.     //-------------------------------------------------------------------------
  4199.     if (temp.rflags & RF_DRIVER)
  4200.         temp.rflags |= drivers[conf.driver].flags;
  4201.     //-------------------------------------------------------------------------
  4202.     // select resolution
  4203.     const unsigned size_x[4] = {        256U,
  4204.                                         conf.mcx_small,
  4205.                                         conf.mcx_full,
  4206.                                         512     //(((conf.t_line * 2) & 0x07 ) == 0)  ? ((conf.t_line * 2) + 8)          :
  4207.                                                 //                                      (((conf.t_line * 2) | 0x07) + 9)
  4208.                                                                                         // full X mode
  4209.                                 };
  4210.     const unsigned size_y[4] = {        192U,
  4211.                                         conf.mcy_small,
  4212.                                         conf.mcy_full,
  4213.                                         324                     // full y mode
  4214.                                 };
  4215.         temp.ox = temp.scx = size_x[conf.bordersize];
  4216.         temp.oy = temp.scy = size_y[conf.bordersize];
  4217.    
  4218.     //-------------------------------------------------------------------------
  4219.     if (temp.rflags & RF_2X)
  4220.     {
  4221.         temp.ox *= 2;
  4222.         temp.oy *= 2;
  4223.         //---------------------------------------------------------------------
  4224.         if (conf.fast_sl && (temp.rflags & RF_DRIVER) && (temp.rflags & (RF_CLIP | RF_OVR)))
  4225.             temp.oy /= 2;
  4226.         //---------------------------------------------------------------------
  4227.     }
  4228.     //-------------------------------------------------------------------------
  4229.     if (temp.rflags & RF_3X)            { temp.ox *= 3;  temp.oy *= 3; }
  4230.     if (temp.rflags & RF_4X)            { temp.ox *= 4;  temp.oy *= 4; }
  4231.     if (temp.rflags & RF_64x48)         { temp.ox = 64;  temp.oy = 48; }
  4232.     if (temp.rflags & RF_128x96)        { temp.ox = 128; temp.oy = 96; }
  4233.     //-------------------------------------------------------------------------
  4234.    //фхсрухЁ
  4235. // if(temp.rflags & RF_MON)     { temp.ox = 640; temp.oy = 480; }
  4236.  
  4237. //NS
  4238. //    if (temp.rflags & RF_MON)
  4239. //    {
  4240. //      if      (temp.rflags & RF_2X)   { temp.ox = 640; temp.oy = 480; }       //RF_2X
  4241. //      else if (temp.rflags & RF_3X)   { temp.ox = 900; temp.oy = 480; }       //RF_3X
  4242. //      else                            { temp.ox = 320; temp.oy = 240; }       //RF_1X
  4243. //    }
  4244.     //-------------------------------------------------------------------------
  4245.     if (temp.rflags & RF_MON)
  4246.     {
  4247.         temp.ox *= temp.mon_scale;      //temp.scale;
  4248.         temp.oy *= temp.mon_scale;      //temp.scale;
  4249.     }
  4250.     //-------------------------------------------------------------------------
  4251.    
  4252. //   printf("temp.ox=%d, temp.oy=%d - 2nd\n", temp.ox, temp.oy);
  4253.    
  4254. }
  4255. //=============================================================================
  4256.  
  4257.  
  4258. //=============================================================================
  4259. static BOOL WINAPI DdEnumDevs(GUID *DevGuid, PSTR DrvDesc, PSTR DrvName, PVOID Ctx, HMONITOR Hm)
  4260. {
  4261.     (void) DrvDesc;
  4262.     (void) DrvName;
  4263.     (void) Hm;
  4264.     //-------------------------------------------------------------------------
  4265.     if (DevGuid)
  4266.     {
  4267.         memcpy( Ctx, DevGuid, sizeof(GUID));
  4268.         return FALSE;
  4269.     }
  4270.     //-------------------------------------------------------------------------
  4271.     return TRUE;
  4272. }
  4273. //=============================================================================
  4274.  
  4275.  
  4276.  
  4277.  
  4278.  
  4279.  
  4280.  
  4281.  
  4282. //=============================================================================
  4283. void start_dx()
  4284. {
  4285. //   printf("%s\n", __FUNCTION__);
  4286.  
  4287. //      printf("start_dx()\n");
  4288.  
  4289.     dsbuffer_sz = DSBUFFER_SZ;
  4290.  
  4291.  
  4292.     //=========================================================================
  4293.     // [NS] test
  4294.  
  4295.        
  4296.         WNDCLASSEX wndclass_debug_tool;
  4297.         wndclass_debug_tool.cbSize =    sizeof(wndclass_debug_tool);
  4298.         wndclass_debug_tool.style =     CS_HREDRAW |    //redraw window when horizontal resize
  4299.                                         CS_VREDRAW;     //redraw window when vertical resize
  4300.         wndclass_debug_tool.lpfnWndProc =       WndProc_debug_tools;    //WndProc;     
  4301.         wndclass_debug_tool.cbClsExtra =        0;
  4302.         wndclass_debug_tool.cbWndExtra =        0;     
  4303.         wndclass_debug_tool.hInstance =         GetModuleHandle(nullptr);
  4304.         wndclass_debug_tool.hIcon =             LoadIcon(       NULL,
  4305.                                                                 IDI_APPLICATION
  4306.                                              );
  4307.         wndclass_debug_tool.hCursor = LoadCursor(       NULL,
  4308.                                                         IDC_ARROW
  4309.                                                  );
  4310.         wndclass_debug_tool.hbrBackground =     (HBRUSH) GetStockObject(NULL_BRUSH);    //(WHITE_BRUSH);
  4311.         wndclass_debug_tool.lpszMenuName =      NULL;  
  4312.         wndclass_debug_tool.lpszClassName =     "Debug_Tool";  
  4313.  
  4314.         wndclass_debug_tool.hIconSm = LoadIcon(         NULL,
  4315.                                                         IDI_APPLICATION
  4316.                                                 );     
  4317.         //---------------------------------------------------------------------
  4318.         RegisterClassEx( &wndclass_debug_tool);
  4319.        
  4320.        
  4321.         //---------------------------------------------------------------------
  4322.         // эр тё ъшщ ёыєўрщ шэшЎшрышчрЎш  ьрёштют debug tools-ют
  4323.         for (int cnt = 0;    cnt < DEBUG_TOOLS_MAX_COUNT;    cnt++)
  4324.         {
  4325.             debug_tool_type[ cnt] = DT_NONE;
  4326.             debug_tool_exist[ cnt] = FALSE;     // 1 - Їыру тъы■ўхээюёЄш
  4327.             debug_tool_delete[ cnt] = FALSE;    // 1 - эр єфрыхэшх
  4328.         }
  4329.         //---------------------------------------------------------------------
  4330.        
  4331. //      run_debug_tool( DT_PALETTE_COMP_PAL);
  4332. //      run_debug_tool( DT_PALETTE_ATM3_PAL);
  4333. //      run_debug_tool( DT_PALETTE_PAL0);
  4334.  
  4335. /*
  4336.        
  4337.         //hwnd_debug_tool = CreateWindowEx(     WS_EX_NOPARENTNOTIFY,
  4338.         //debug_tool_create = TRUE;
  4339.         debug_tool_create_nmb = 0;
  4340.         debug_tool_type[0] = 1;
  4341.         debug_tool_hwnd[0] = CreateWindowEx(    WS_EX_NOPARENTNOTIFY,
  4342.                                                 //WS_EX_NOPARENTNOTIFY,// |
  4343.                                                 //  WS_EX_PALETTEWINDOW,
  4344.                                                 "Debug_Tool",           // window class name
  4345.                                                 "Debug_Tool_Window",    // window caption
  4346.                                                 WS_OVERLAPPEDWINDOW,    // window style
  4347.                                                 CW_USEDEFAULT,          // initial x position
  4348.                                                 CW_USEDEFAULT,          // initial y position
  4349.                                                 320,                    // initial x size
  4350.                                                 320,                    // initial y size
  4351.                                                 NULL,                   // parent window handle
  4352.                                                 NULL,                   // window menu handle
  4353.                                                 GetModuleHandle(nullptr), // program instance handle
  4354.                                                 NULL                    // creation parameters
  4355.                                        );
  4356.         ShowWindow( debug_tool_hwnd[0], SW_SHOWNORMAL); //SW_SHOWMINNOACTIVE
  4357.         UpdateWindow( debug_tool_hwnd[0]);
  4358.         //---------------------------------------------------------------------
  4359.        
  4360.         //hwnd_debug_tool_2 = CreateWindow(
  4361.         //debug_tool_create = TRUE;
  4362.         debug_tool_create_nmb = 1;
  4363.         debug_tool_type[1] = 2;
  4364.         debug_tool_hwnd[1] = CreateWindow(     
  4365.                                         "Debug_Tool",           // window class name
  4366.                                         "Debug_Tool_Window_2",  // window caption
  4367.                                         WS_OVERLAPPEDWINDOW,    // window style
  4368.                                         CW_USEDEFAULT,          // initial x position
  4369.                                         CW_USEDEFAULT,          // initial y position
  4370.                                         320,                    // initial x size
  4371.                                         200,                    // initial y size
  4372.                                         NULL,                   // parent window handle
  4373.                                         NULL,                   // window menu handle
  4374.                                         GetModuleHandle(nullptr), // program instance handle
  4375.                                         NULL                    // creation parameters
  4376.                                        );
  4377.         ShowWindow( debug_tool_hwnd[1], SW_SHOWNORMAL); //SW_SHOWMINNOACTIVE
  4378.         UpdateWindow( debug_tool_hwnd[1]);
  4379.     //=========================================================================
  4380.  
  4381.         debug_tool_create_nmb = 2;
  4382.         debug_tool_type[2] = 3;
  4383.         debug_tool_hwnd[2] = CreateWindow(     
  4384.                                         "Debug_Tool",           // window class name
  4385.                                         "Debug_Tool_Window_2",  // window caption
  4386.                                         WS_OVERLAPPEDWINDOW,    // window style
  4387.                                         CW_USEDEFAULT,          // initial x position
  4388.                                         CW_USEDEFAULT,          // initial y position
  4389.                                         320,                    // initial x size
  4390.                                         200,                    // initial y size
  4391.                                         NULL,                   // parent window handle
  4392.                                         NULL,                   // window menu handle
  4393.                                         GetModuleHandle(nullptr), // program instance handle
  4394.                                         NULL                    // creation parameters
  4395.                                        );
  4396.         ShowWindow( debug_tool_hwnd[2], SW_SHOWNORMAL); //SW_SHOWMINNOACTIVE
  4397.         UpdateWindow( debug_tool_hwnd[2]);
  4398. */
  4399.  
  4400.  
  4401.     //=========================================================================
  4402.    
  4403.     WNDCLASSEX  wc = { };
  4404.  
  4405.     wc.cbSize = sizeof(WNDCLASSEX);
  4406.  
  4407.     wc.lpfnWndProc = WndProc;
  4408.     hIn = wc.hInstance = GetModuleHandle(nullptr);
  4409.     wc.lpszClassName = "EMUL_WND";
  4410.     wc.hIcon = LoadIcon(hIn, MAKEINTRESOURCE(IDI_ICON2));
  4411.     wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
  4412.     wc.style =  CS_HREDRAW |
  4413.                 CS_VREDRAW |
  4414.                 CS_DBLCLKS ;    // [NS] фтющэ√х ъышъш яю юъэє
  4415.                
  4416. //#define WHITE_BRUSH 0
  4417. //#define LTGRAY_BRUSH 1
  4418. //#define GRAY_BRUSH 2
  4419. //#define DKGRAY_BRUSH 3
  4420. //#define BLACK_BRUSH 4
  4421. //#define NULL_BRUSH 5
  4422. //#define HOLLOW_BRUSH NULL_BRUSH
  4423.  
  4424. //  wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);    // [NS]
  4425.     //  Єръ ьюцэю чръЁр°штрЄ№ юъэю ўхЁэ√ь яю фхЇюыЄє
  4426.     //    Єръ ьхэ№°х тшфэю эхъюЄюЁ√х схы√х їтюёЄю рЁЄшЇръЄ√
  4427.     //      яє°ю Єюфр юэш ўхЁэ√х
  4428.     // эхя              ═╬ схч ¤Єюую ЁрсюЄрхЄ Ёхцшь эх ЁшёютрЄ№ эшўхую тююс∙х
  4429.     //                    ўЄю ыєў°х ЁрсюЄрхЄ ъюуфр т√Є уштрх°№ фхсрухЁ шч яюф уЁрэшЎ√ ¤ъЁрэр
  4430.     //                    Єюуфр эр эхюсэютыхээющ ўрёЄш тшёшЄ ёЄрЁюх шчюсЁрцхэшх ъюЄюЁюх яюїюцх эр эютюх
  4431.     // эр ёрьюь фхых хёыш єсЁрЄ№ WM_ERASEBKGND Єю тёх ╬╩
  4432.    
  4433.     // сюыхх ыєў°шщ трЁшрэЄ
  4434.     // ЄхяхЁ№ тююс∙х схч ыхт√ї їтюёЄют
  4435.     // (ЄхяхЁ№ їтюёЄ√ т тшфх яЁюыхЄр■∙хую ётхЁїє юъэр (эр сюы№°ющ ёъюЁюёЄш ¤Єю тююс∙х эх тшфэю))
  4436.     wc.hbrBackground = (HBRUSH) GetStockObject( NULL_BRUSH);    // [NS]
  4437.  
  4438.     // хёЄ№ х∙х ъръющЄю DC_BRUSH
  4439.     // шэЄхЁхёэю ўЄю юэ фхырхЄ
  4440.  
  4441.      
  4442.    
  4443.    
  4444.     RegisterClassEx( &wc);              //!!!!
  4445.     //-------------------------------------------------------------------------
  4446.     for (int i = 0;     i < 9;     i++)
  4447.         crs[i] = LoadCursor(hIn, MAKEINTRESOURCE(IDC_C0+i));
  4448.     //-------------------------------------------------------------------------
  4449.        
  4450.     //Alone Coder 0.36.6
  4451.     RECT rect1;
  4452.     SystemParametersInfo(       SPI_GETWORKAREA,
  4453.                                 0,
  4454.                                 &rect1,
  4455.                                 0
  4456.                         );
  4457.     //~
  4458.     CalcWindowSize();
  4459.  
  4460.     int cx = int(temp.ox * temp.scale);
  4461.     int cy = int(temp.oy * temp.scale);
  4462.  
  4463.     RECT Client = {     0,
  4464.                         0,
  4465.                         cx,
  4466.                         cy
  4467.                    };
  4468.     AdjustWindowRect(   &Client,
  4469.                         WS_VISIBLE | WS_OVERLAPPEDWINDOW,
  4470.                         0
  4471.                      );
  4472.     cx = Client.right - Client.left;
  4473.     cy = Client.bottom - Client.top;
  4474.     int winx = rect1.left + (rect1.right - rect1.left - cx) / 2;
  4475.     int winy = rect1.top + (rect1.bottom - rect1.top - cy) / 2;
  4476.  
  4477.     winx = winx < 0 ? 0 : winx; // [alex rider]
  4478.     winy = winy < 0 ? 0 : winy; // ўЄюс чруюыютюъ эх т√ырчшы чр уЁрэшЎє ¤ъЁрэр
  4479.        
  4480.     main_menu = LoadMenu(       hIn,
  4481.                                 MAKEINTRESOURCE( IDR_MAINMENU)
  4482.                          );
  4483. //  wnd = CreateWindow(
  4484.     wnd = CreateWindowEx(       0,      //WS_EX_STATICEDGE      // DWORD dwExStyle,
  4485.                                 "EMUL_WND",                     // LPCTSTR lpClassName,
  4486.                                 "Unreal_NS", //"UnrealSpeccy",  // LPCTSTR lpWindowName
  4487.                                 WS_VISIBLE      |               // DWORD dwStyle
  4488.                                   WS_OVERLAPPEDWINDOW,  //orig
  4489.                                 //WS_BORDER | WS_SYSMENU | WS_MINIMIZEBOX ,
  4490.                                 winx,                           // int x
  4491.                                 winy,                           // int y
  4492.                                 cx,                             // int nWidth
  4493.                                 cy,                             // int nHeight
  4494.                                 nullptr,                        // HWND hWndParent
  4495.                                 main_menu,      //nullptr,      // HMENU hMenu
  4496.                                 hIn,                            // HINSTANCE hInstance
  4497.                                 nullptr                         // LPVOID lpParam
  4498.                         );
  4499.                        
  4500.     //-------------------------------------------------------------------------
  4501.     if (!wnd)
  4502.     {
  4503.         __debugbreak();
  4504.     }
  4505.     //-------------------------------------------------------------------------
  4506.  
  4507.     DragAcceptFiles(    wnd,
  4508.                         1
  4509.                     );
  4510.  
  4511.     temp.gdidc = GetDC(wnd);
  4512.     GetSystemPaletteEntries(    temp.gdidc,
  4513.                                 0,
  4514.                                 0x100,
  4515.                                 syspalette
  4516.                             );
  4517.  
  4518.     //-------------------------------------------------------------------------
  4519.     HMENU sys = GetSystemMenu(  wnd,
  4520.                                 FALSE   //0
  4521.                               );
  4522.  
  4523. // WINUSERAPI WINBOOL WINAPI RemoveMenu(  HMENU hMenu, UINT uPosition, UINT uFlags);
  4524. // WINUSERAPI WINBOOL WINAPI DeleteMenu(  HMENU hMenu, UINT uPosition, UINT uFlags);
  4525.  
  4526. // WINUSERAPI WINBOOL WINAPI InsertMenuA( HMENU hMenu, UINT uPosition, UINT uFlags, UINT_PTR uIDNewItem, LPCSTR  lpNewItem);
  4527. // WINUSERAPI WINBOOL WINAPI InsertMenuW( HMENU hMenu, UINT uPosition, UINT uFlags, UINT_PTR uIDNewItem, LPCWSTR lpNewItem);
  4528. // WINUSERAPI WINBOOL WINAPI AppendMenuA( HMENU hMenu,                 UINT uFlags, UINT_PTR uIDNewItem, LPCSTR  lpNewItem);
  4529. // WINUSERAPI WINBOOL WINAPI AppendMenuW( HMENU hMenu,                 UINT uFlags, UINT_PTR uIDNewItem, LPCWSTR lpNewItem);
  4530. // WINUSERAPI WINBOOL WINAPI ModifyMenuA( HMENU hMnu,  UINT uPosition, UINT uFlags, UINT_PTR uIDNewItem, LPCSTR  lpNewItem);
  4531. // WINUSERAPI WINBOOL WINAPI ModifyMenuW( HMENU hMnu,  UINT uPosition, UINT uFlags, UINT_PTR uIDNewItem, LPCWSTR lpNewItem);
  4532.  
  4533.  
  4534.     if (sys)
  4535.     {
  4536.    
  4537.  
  4538.  
  4539.    
  4540. //      int cnt;
  4541. //      int menu_size = GetMenuItemCount( sys);
  4542. //      //---------------------------------------------------------------------
  4543. //      // єфры хь тё╕ шч ъюэЄхъёэюую ьхэ■ эрї
  4544. //      // шсю їч ўхую Єрь эряшїрхЄ тшэ15 ш т ъръшї ъюышўхёЄтрї
  4545. //      for (cnt = 0;    cnt < menu_size;    cnt++)
  4546. //      {
  4547. //          printf("cnt %d\n",cnt);
  4548. //          char string[200];
  4549. //          GetMenuString( sys, cnt, string, 50, MF_BYPOSITION);
  4550. //          printf("%s\n",string);
  4551. //          RemoveMenu( sys, cnt, MF_BYPOSITION);
  4552. //      //  DeleteMenu( sys, cnt, MF_BYPOSITION);
  4553. //      }
  4554. //      // эю ўхЄр юэю эх єфры хЄ тёх яєэъЄ√
  4555.         //---------------------------------------------------------------------
  4556.        
  4557. //      // Єръюх єфры хЄ тёх яєэъЄ√
  4558. //      DeleteMenu( sys, SC_MOVE,       MF_STRING);
  4559. //      DeleteMenu( sys, SC_RESTORE,    MF_STRING);
  4560. //      DeleteMenu( sys, SC_SIZE,       MF_STRING);
  4561. //      DeleteMenu( sys, SC_MINIMIZE,   MF_STRING);
  4562. //      DeleteMenu( sys, SC_MAXIMIZE,   MF_STRING);
  4563. //      DeleteMenu( sys, SC_CLOSE,      MF_STRING);     // тьхёЄх юЄярфрхЄ ъэюяър чръЁ√Єш 
  4564. //      RemoveMenu( sys, SC_CLOSE,      MF_STRING);     // тьхёЄх юЄярфрхЄ ъэюяър чръЁ√Єш 
  4565.  
  4566. //      DeleteMenu( sys, SC_CLOSE,      MF_STRING);     //
  4567. //      AppendMenu( sys, MF_STRING, SC_CLOSE, "╤louze");        //Єръ ъэюяър эх юЄярфрхЄ
  4568.  
  4569.  
  4570.  
  4571.         //---------------------------------------------------------------------
  4572.         // ухэхЁрЎш  Ёрчэ√ї эрчтрэшщ ьрё°Єрсют (т√ёЄрты хЄё  Єюы№ъю яЁш ёЄрЁЄх)         // [NS]
  4573.         // р яюЄюь ьхэ хЄё  т emulkeys.cpp
  4574.         char sys_x1[5]; char sys_x2[5]; char sys_x3[5]; char sys_x4[5];
  4575.         //---------------------------------------------------------------------
  4576.         if      (temp.rflags & RF_4X)
  4577.             { strcpy(sys_x1,"x4"); strcpy(sys_x1,"x8"); strcpy(sys_x1,"x12"); strcpy(sys_x1,"x16"); }
  4578.         //---------------------------------------------------------------------
  4579.         else if (temp.rflags & RF_3X)
  4580.             { strcpy(sys_x1,"x3"); strcpy(sys_x2,"x6"); strcpy(sys_x3,"x9"); strcpy(sys_x4,"x12"); }
  4581.         //---------------------------------------------------------------------
  4582.         else if (temp.rflags & RF_2X)
  4583.             { strcpy(sys_x1,"x2"); strcpy(sys_x2,"x4"); strcpy(sys_x3,"x6"); strcpy(sys_x4,"x8"); }
  4584.         //---------------------------------------------------------------------
  4585.         else if (temp.rflags & RF_1X)
  4586.             { strcpy(sys_x1,"x1"); strcpy(sys_x2,"x2"); strcpy(sys_x3,"x3"); strcpy(sys_x4,"x4"); }
  4587.         //---------------------------------------------------------------------
  4588.  
  4589.  
  4590.         InsertMenu( sys, 0, MF_BYPOSITION | MF_STRING, SCU_LOCK_MOUSE, "&Lock mouse");
  4591.         InsertMenu( sys, 1, MF_BYPOSITION | MF_SEPARATOR, 0, nullptr); //------
  4592.         InsertMenu( sys, 2, MF_BYPOSITION | MF_STRING, SCU_SCALE1, sys_x1);
  4593.         InsertMenu( sys, 3, MF_BYPOSITION | MF_STRING, SCU_SCALE2, sys_x2);
  4594.         InsertMenu( sys, 4, MF_BYPOSITION | MF_STRING, SCU_SCALE3, sys_x3);
  4595.         InsertMenu( sys, 5, MF_BYPOSITION | MF_STRING, SCU_SCALE4, sys_x4);
  4596.         InsertMenu( sys, 6, MF_BYPOSITION | MF_SEPARATOR, 0, nullptr); //------
  4597. //      InsertMenu( sys, 7, MF_BYPOSITION, SC_CLOSE);
  4598.  
  4599.         // юэю ш схч ¤Єюую тЁюфх ЁрсюЄрхЄ
  4600.         // эю эр тё ъшщ ёыєўрщ
  4601.         // рЄю тфЁєу эх сєфхЄ юЄюсЁрцрЄ№ ёЄрЁЄют√х эрёЄЁющъш шч ъюэЇшур
  4602.         //---------------------------------------------------------------------
  4603.         HMENU main_menu = GetMenu( wnd);
  4604.         //---------------------------------------------------------------------
  4605.         if (main_menu)
  4606.         {
  4607.             ModifyMenu( main_menu, IDM_SCALE1, MF_BYCOMMAND | MF_STRING, IDM_SCALE1, sys_x1);
  4608.             ModifyMenu( main_menu, IDM_SCALE2, MF_BYCOMMAND | MF_STRING, IDM_SCALE2, sys_x2);
  4609.             ModifyMenu( main_menu, IDM_SCALE3, MF_BYCOMMAND | MF_STRING, IDM_SCALE3, sys_x3);
  4610.             ModifyMenu( main_menu, IDM_SCALE4, MF_BYCOMMAND | MF_STRING, IDM_SCALE4, sys_x4);
  4611.         }
  4612.         //---------------------------------------------------------------------
  4613.  
  4614. //      // ёЄрЁр  ьхэ■°єър
  4615. //      AppendMenu(sys, MF_SEPARATOR, 0, nullptr);
  4616. //      AppendMenu(sys, MF_STRING, SCU_SCALE1, "x1");
  4617. //      AppendMenu(sys, MF_STRING, SCU_SCALE2, "x2");
  4618. //      AppendMenu(sys, MF_STRING, SCU_SCALE3, "x3");
  4619. //      AppendMenu(sys, MF_STRING, SCU_SCALE4, "x4");
  4620. //      AppendMenu(sys, MF_STRING, SCU_LOCK_MOUSE, "&Lock mouse");
  4621.  
  4622.     }
  4623.     //-------------------------------------------------------------------------
  4624.     InitCommonControls();
  4625.  
  4626.     HRESULT r;
  4627.     GUID DdDevGuid;
  4628.     //-------------------------------------------------------------------------
  4629.     if ( (r = DirectDrawEnumerateEx(    DdEnumDevs,
  4630.                                         &DdDevGuid,
  4631.                                         DDENUM_ATTACHEDSECONDARYDEVICES
  4632.                                 )
  4633.          ) != DD_OK
  4634.      )
  4635.     {
  4636.         printrdd("DirectDrawEnumerate()", r);
  4637.         exit();
  4638.     }
  4639.     //-------------------------------------------------------------------------
  4640.     LPDIRECTDRAW dd0;
  4641.     //-------------------------------------------------------------------------
  4642.     if ( (r = DirectDrawCreate(    nullptr /*&DdDevGuid*/,
  4643.                                    &dd0,
  4644.                                    nullptr
  4645.                                  )
  4646.         ) != DD_OK
  4647.      )
  4648.     {
  4649.         printrdd("DirectDrawCreate()", r);
  4650.         exit();
  4651.     }
  4652.     //-------------------------------------------------------------------------
  4653.     if ((r = dd0->QueryInterface( IID_IDirectDraw2, (void**)&dd)) != DD_OK)
  4654.     {
  4655.         printrdd("IDirectDraw::QueryInterface(IID_IDirectDraw2)", r);
  4656.         exit();
  4657.     }
  4658.     //-------------------------------------------------------------------------
  4659.     dd0->Release();
  4660.  
  4661.     color(CONSCLR_HARDITEM);
  4662.     printf("gfx: ");
  4663.     //-------------------------------------------------------------------------
  4664.     char vmodel[MAX_DDDEVICEID_STRING + 32];
  4665.     *vmodel = 0;
  4666.     //-------------------------------------------------------------------------
  4667.     if (conf.detect_video)
  4668.     {
  4669.         LPDIRECTDRAW4 dd4;
  4670.         //---------------------------------------------------------------------
  4671.         if ((r = dd->QueryInterface(IID_IDirectDraw4, (void**)&dd4)) == DD_OK)
  4672.         {
  4673.             DDDEVICEIDENTIFIER di;
  4674.             //-----------------------------------------------------------------
  4675.             if (dd4->GetDeviceIdentifier( &di, 0) == DD_OK)
  4676.             {
  4677.                 trim_right(di.szDescription);
  4678.                 CharToOem(di.szDescription, di.szDescription);
  4679.                 sprintf(vmodel, "%04lX-%04lX (%s)", di.dwVendorId, di.dwDeviceId, di.szDescription);
  4680.             }
  4681.             //-----------------------------------------------------------------
  4682.             else
  4683.             {
  4684.                 sprintf(vmodel, "unknown device");
  4685.             }
  4686.             //-----------------------------------------------------------------
  4687.             dd4->Release();
  4688.         }
  4689.         //---------------------------------------------------------------------
  4690.         if (*vmodel)
  4691.             strcat( vmodel, ", ");
  4692.         //---------------------------------------------------------------------
  4693.     }
  4694.     //-------------------------------------------------------------------------
  4695.     DDCAPS caps;
  4696.     caps.dwSize = sizeof caps;
  4697.     dd->GetCaps(&caps, nullptr);
  4698.  
  4699.     color(CONSCLR_HARDINFO);
  4700.  
  4701.     const u32 Vmem = caps.dwVidMemTotal;
  4702.     printf("%s%uMb VRAM available\n", vmodel, unsigned(Vmem/(1024U*1024U)+((Vmem%(1024U*1024U))>512U*1024U)));
  4703.  
  4704.     max_modes = 0;
  4705.     dd->EnumDisplayModes(DDEDM_REFRESHRATES | DDEDM_STANDARDVGAMODES, nullptr, nullptr, callb);
  4706.     //-------------------------------------------------------------------------
  4707.     if ((temp.rflags & (RF_D3D | RF_D3DE)))
  4708.         StartD3d(wnd);
  4709.     //-------------------------------------------------------------------------
  4710.    
  4711.    
  4712.    
  4713.     //-------------------------------------------------------------------------
  4714.     WAVEFORMATEX wf = { };
  4715.     wf.wFormatTag = WAVE_FORMAT_PCM;
  4716.     wf.nSamplesPerSec = conf.sound.fq;
  4717.     wf.nChannels = 2;
  4718.     wf.wBitsPerSample = 16;
  4719.     wf.nBlockAlign = 4;
  4720.     wf.nAvgBytesPerSec = wf.nSamplesPerSec * wf.nBlockAlign;
  4721.     //-------------------------------------------------------------------------
  4722.     if (conf.sound.do_sound == do_sound_wave)
  4723.     {
  4724.         MMRESULT mmr;
  4725.         //---------------------------------------------------------------------
  4726.         if ( (mmr = waveOutOpen(    &hwo,
  4727.                                     WAVE_MAPPER,
  4728.                                     &wf,
  4729.                                     0,
  4730.                                     0,
  4731.                                     CALLBACK_NULL
  4732.                                  )
  4733.             ) != MMSYSERR_NOERROR
  4734.          )
  4735.         {
  4736.             printrmm("waveOutOpen()", mmr);
  4737.             hwo = nullptr;
  4738.             goto sfail;
  4739.         }
  4740.         //---------------------------------------------------------------------
  4741.         wqhead = 0;
  4742.         wqtail = 0;
  4743.     }
  4744.     //-------------------------------------------------------------------------
  4745.     else if (conf.sound.do_sound == do_sound_ds)
  4746.     {
  4747.         //---------------------------------------------------------------------
  4748.         if ( (r = DirectSoundCreate(    nullptr,
  4749.                                         &ds,
  4750.                                         nullptr
  4751.                                 )
  4752.                 ) != DS_OK
  4753.          )
  4754.         {
  4755.             printrds("DirectSoundCreate()", r);
  4756.             goto sfail;
  4757.         }
  4758.         //---------------------------------------------------------------------
  4759.         r = -1;
  4760.         //---------------------------------------------------------------------
  4761.         if (conf.sound.dsprimary)       // Off by default
  4762.         {
  4763.             r = ds->SetCooperativeLevel(    wnd,
  4764.                                             DSSCL_WRITEPRIMARY
  4765.                                           );
  4766.         }
  4767.         //---------------------------------------------------------------------
  4768.         if (r != DS_OK)
  4769.         {
  4770.             r = ds->SetCooperativeLevel(    wnd,
  4771.                                             DSSCL_NORMAL
  4772.                                           );
  4773.             conf.sound.dsprimary = 0;
  4774.         }
  4775.         //---------------------------------------------------------------------
  4776.         if (r != DS_OK)
  4777.         {
  4778.             printrds("IDirectSound::SetCooperativeLevel()", r);
  4779.             goto sfail;
  4780.         }
  4781.         //---------------------------------------------------------------------
  4782.         DSBUFFERDESC dsdesc = { sizeof(DSBUFFERDESC) };
  4783.         r = -1;
  4784.         //---------------------------------------------------------------------
  4785.         if (conf.sound.dsprimary)       // Off by default
  4786.         {
  4787.             dsdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_PRIMARYBUFFER;
  4788.             dsdesc.dwBufferBytes = 0;
  4789.             dsdesc.lpwfxFormat = nullptr;
  4790.             r = ds->CreateSoundBuffer(  &dsdesc,
  4791.                                         &dsbf,
  4792.                                         nullptr
  4793.                                     );
  4794.             //-----------------------------------------------------------------
  4795.             if (r != DS_OK)
  4796.             {
  4797.                 printrds("IDirectSound::CreateSoundBuffer() [primary]", r);
  4798.             }
  4799.             //-----------------------------------------------------------------
  4800.             else
  4801.             {
  4802.                 r = dsbf->SetFormat( &wf);
  4803.                 //-------------------------------------------------------------
  4804.                 if (r != DS_OK)
  4805.                 {
  4806.                     printrds("IDirectSoundBuffer::SetFormat()", r);
  4807.                     goto sfail;
  4808.                 }
  4809.                 //-------------------------------------------------------------
  4810.                 DSBCAPS caps;
  4811.                 caps.dwSize = sizeof caps;
  4812.                 dsbf->GetCaps( &caps);
  4813.                 dsbuffer_sz = caps.dwBufferBytes;
  4814.             }
  4815.             //-----------------------------------------------------------------
  4816.         } // (conf.sound.dsprimary)
  4817.         //---------------------------------------------------------------------
  4818.         if (r != DS_OK)
  4819.         {
  4820.             dsdesc.lpwfxFormat = &wf;
  4821.             dsdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS;
  4822.             dsbuffer_sz = dsdesc.dwBufferBytes = DSBUFFER_SZ;
  4823.             //-----------------------------------------------------------------
  4824.             if ( (r = ds->CreateSoundBuffer(    &dsdesc,
  4825.                                                 &dsbf,
  4826.                                                 nullptr
  4827.                                             )
  4828.                         ) != DS_OK
  4829.              )
  4830.             {
  4831.                 printrds("IDirectSound::CreateSoundBuffer()", r);
  4832.                 goto sfail;
  4833.             }
  4834.             //-----------------------------------------------------------------
  4835.             conf.sound.dsprimary = 0;
  4836.         }
  4837.         //---------------------------------------------------------------------
  4838.         dsoffset = dsbuffer_sz / 4;
  4839.     }
  4840.     //-------------------------------------------------------------------------
  4841.     else
  4842.     {
  4843. sfail:
  4844.         conf.sound.do_sound = do_sound_none;
  4845.     }
  4846.     //-------------------------------------------------------------------------
  4847.    
  4848.    
  4849.    
  4850.    
  4851.     //-------------------------------------------------------------------------
  4852.    
  4853.     LPDIRECTINPUT di;
  4854.     r = DirectInputCreate( hIn, DIRECTINPUT_VERSION, &di,nullptr);
  4855.    
  4856.     //-------------------------------------------------------------------------
  4857.     if ((r != DI_OK) && (r = DirectInputCreate( hIn, 0x0300, &di, nullptr)) != DI_OK)
  4858.     {
  4859.         printrdi("DirectInputCreate()", r);
  4860.         exit();
  4861.     }
  4862.     //-------------------------------------------------------------------------
  4863.     if ((r = di->CreateDevice(GUID_SysKeyboard, &dikeyboard, nullptr)) != DI_OK)
  4864.     {
  4865.         printrdi("IDirectInputDevice::CreateDevice() (keyboard)", r);
  4866.         exit();
  4867.     }
  4868.     //-------------------------------------------------------------------------
  4869.     if ((r = dikeyboard->SetDataFormat( &c_dfDIKeyboard)) != DI_OK)
  4870.     {
  4871.         printrdi("IDirectInputDevice::SetDataFormat() (keyboard)", r);
  4872.         exit();
  4873.     }
  4874.     //-------------------------------------------------------------------------
  4875.     if ((r = dikeyboard->SetCooperativeLevel( wnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)) != DI_OK)
  4876.     {
  4877.         printrdi("IDirectInputDevice::SetCooperativeLevel() (keyboard)", r);
  4878.         exit();
  4879.     }
  4880.     //-------------------------------------------------------------------------
  4881.     if ((r = di->CreateDevice( GUID_SysMouse, &dimouse, nullptr)) == DI_OK)
  4882.     {
  4883.         //---------------------------------------------------------------------
  4884.         if ((r = dimouse->SetDataFormat( &c_dfDIMouse)) != DI_OK)
  4885.         {
  4886.             printrdi("IDirectInputDevice::SetDataFormat() (mouse)", r);
  4887.             exit();
  4888.         }
  4889.         //---------------------------------------------------------------------
  4890.         if ((r = dimouse->SetCooperativeLevel( wnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)) != DI_OK)
  4891.         {
  4892.             printrdi("IDirectInputDevice::SetCooperativeLevel() (mouse)", r);
  4893.             exit();
  4894.         }
  4895.         //---------------------------------------------------------------------
  4896.         DIPROPDWORD dipdw = { };
  4897.         dipdw.diph.dwSize       = sizeof( dipdw);
  4898.         dipdw.diph.dwHeaderSize = sizeof( dipdw.diph);
  4899.         dipdw.diph.dwHow        = DIPH_DEVICE;
  4900.         dipdw.dwData            = DIPROPAXISMODE_ABS;
  4901.         //---------------------------------------------------------------------
  4902.         if ((r = dimouse->SetProperty( DIPROP_AXISMODE, &dipdw.diph)) != DI_OK)
  4903.         {
  4904.             printrdi("IDirectInputDevice::SetProperty() (mouse)", r);
  4905.             exit();
  4906.         }
  4907.         //---------------------------------------------------------------------
  4908.     }
  4909.     //-------------------------------------------------------------------------
  4910.     else
  4911.     {
  4912.         color( CONSCLR_WARNING);
  4913.         printf("warning: no mouse\n");
  4914.         dimouse = nullptr;
  4915.     }
  4916.     //-------------------------------------------------------------------------
  4917.     if ((r = di->EnumDevices( DIDEVTYPE_JOYSTICK, InitJoystickInput, di, DIEDFL_ATTACHEDONLY)) != DI_OK)
  4918.     {
  4919.         printrdi("IDirectInput::EnumDevices(DIDEVTYPE_JOYSTICK,...)", r);
  4920.         exit();
  4921.     }
  4922.     //-------------------------------------------------------------------------
  4923.     di->Release();
  4924. //[vv]   SetKeyboardState(kbdpc); // fix bug in win95
  4925. }
  4926. //=============================================================================
  4927.  
  4928.  
  4929.  
  4930.  
  4931. //=============================================================================
  4932. static void DoneD3d(bool DeInitDll)
  4933. {
  4934. //    printf("%s(%d)\n", __FUNCTION__, DeInitDll);
  4935.     ULONG RefCnt;
  4936.     //-------------------------------------------------------------------------
  4937.     if (SurfTexture)
  4938.     {
  4939.         RefCnt = SurfTexture->Release();
  4940.         (void)RefCnt;
  4941. /*
  4942. #ifdef _DEBUG //---------------------------------------------------------------
  4943.         if(RefCnt != 0)
  4944.         {
  4945.             __debugbreak();
  4946.         }
  4947. #endif //----------------------------------------------------------------------
  4948. */
  4949.         SurfTexture = nullptr;
  4950.     }
  4951.     //-------------------------------------------------------------------------
  4952.     if (Texture)
  4953.     {
  4954.         RefCnt = Texture->Release();
  4955.        
  4956. #ifdef _DEBUG //---------------------------------------------------------------
  4957.         if (RefCnt != 0)
  4958.         {
  4959.             __debugbreak();
  4960.         }
  4961. #endif //----------------------------------------------------------------------
  4962.  
  4963.         Texture = nullptr;
  4964.     }
  4965.     //-------------------------------------------------------------------------
  4966.     if (D3dDev)
  4967.     {
  4968.         RefCnt = D3dDev->Release();
  4969.        
  4970. #ifdef _DEBUG //---------------------------------------------------------------
  4971.         if (RefCnt != 0)
  4972.         {
  4973.             __debugbreak();
  4974.         }
  4975. #endif //----------------------------------------------------------------------
  4976.  
  4977.         D3dDev = nullptr;
  4978.     }
  4979.     //-------------------------------------------------------------------------
  4980.     if (D3d9)
  4981.     {
  4982.         RefCnt = D3d9->Release();
  4983.        
  4984. #ifdef _DEBUG //---------------------------------------------------------------
  4985.         if (RefCnt != 0)
  4986.         {
  4987.             __debugbreak();
  4988.         }
  4989. #endif //----------------------------------------------------------------------
  4990.  
  4991.         D3d9 = nullptr;
  4992.     }
  4993.     //-------------------------------------------------------------------------
  4994.     if (DeInitDll && D3d9Dll)
  4995.     {
  4996.         FreeLibrary(D3d9Dll);
  4997.         D3d9Dll = nullptr;
  4998.     }
  4999.     //-------------------------------------------------------------------------
  5000. }
  5001. //=============================================================================
  5002.  
  5003.  
  5004. //=============================================================================
  5005. void done_dx()
  5006. {
  5007.     sound_stop();
  5008.     // ????????????
  5009.     //-------------------------------------------------------------------------
  5010.     if (pal)     
  5011.         pal->Release();    
  5012.     pal = nullptr;
  5013.     //-------------------------------------------------------------------------
  5014.     if (surf2)   
  5015.         surf2->Release();          
  5016.     surf2 = nullptr;
  5017.     //-------------------------------------------------------------------------
  5018.     if (surf1)   
  5019.         surf1->Release();          
  5020.     surf1 = nullptr;
  5021.     //-------------------------------------------------------------------------
  5022.     if (surf0)   
  5023.         surf0->Release();        
  5024.     surf0 = nullptr;
  5025.     //-------------------------------------------------------------------------
  5026.     if (sprim)   
  5027.         sprim->Release();          
  5028.     sprim = nullptr;
  5029.     //-------------------------------------------------------------------------
  5030.     if (clip)    
  5031.         clip->Release();           
  5032.     clip = nullptr;
  5033.     //-------------------------------------------------------------------------
  5034.     if (dd)      
  5035.         dd->Release();     
  5036.     dd = nullptr;
  5037.     //-------------------------------------------------------------------------
  5038.     if (SurfMem1)
  5039.         _aligned_free( SurfMem1);
  5040.     SurfMem1 = nullptr;
  5041.     //-------------------------------------------------------------------------
  5042.     if (dikeyboard)
  5043.     {
  5044.         dikeyboard->Unacquire();
  5045.         dikeyboard->Release();
  5046.         dikeyboard = nullptr;
  5047.     }
  5048.     //-------------------------------------------------------------------------
  5049.     if (dimouse)
  5050.     {
  5051.         dimouse->Unacquire();
  5052.         dimouse->Release();
  5053.         dimouse = nullptr;
  5054.     }
  5055.     //-------------------------------------------------------------------------
  5056.     if (dijoyst)
  5057.     {
  5058.         dijoyst->Unacquire();
  5059.         dijoyst->Release();
  5060.         dijoyst = nullptr;
  5061.     }
  5062.     //-------------------------------------------------------------------------
  5063.     if (hwo)
  5064.     {
  5065.         waveOutReset( hwo);
  5066.         /* waveOutUnprepareHeader()'s ? */
  5067.         waveOutClose( hwo);
  5068.     }
  5069.     //-------------------------------------------------------------------------
  5070.     if (dsbf)
  5071.         dsbf->Release();
  5072.     dsbf = nullptr;
  5073.     //-------------------------------------------------------------------------
  5074.     if (ds)
  5075.         ds->Release();
  5076.     ds = nullptr;
  5077.     //-------------------------------------------------------------------------
  5078.     if (hbm)
  5079.         DeleteObject( hbm);
  5080.     hbm = nullptr;
  5081.     //-------------------------------------------------------------------------
  5082.     if (temp.gdidc)
  5083.         ReleaseDC( wnd, temp.gdidc);
  5084.     temp.gdidc = nullptr;
  5085.     //-------------------------------------------------------------------------
  5086.     DoneD3d();
  5087.     //-------------------------------------------------------------------------
  5088.     if (wnd)
  5089.         DestroyWindow( wnd);
  5090.     //-------------------------------------------------------------------------
  5091. }
  5092. //=============================================================================
  5093.  
  5094.  
  5095.  
  5096.  
  5097.  
  5098.  
  5099.  
  5100.  
  5101.  
  5102.  
  5103. void reinit_sound_ds()  // [NS]
  5104. {
  5105. // Єръ яюыєўрхЄёю т√Є эєєЄ№ usb audio ш яЁюфюыцшЄ№ ЁрсюЄрЄ№ эр эрсюЁЁЄэюь чтєъх
  5106. // эю эх яюыєўрхЄёю яюфїтрЄшЄ№ тюЄъэєЄюх юсЁрЄэю usb audio
  5107. // яш°юЄ DirectSoundCreate(): 0x88780078, DSERR_NODRIVER
  5108.  
  5109.         //printf("1\n");
  5110.         sound_stop();
  5111.        
  5112. reinit_again:
  5113.         //conf.sound.do_sound == do_sound_wave;
  5114.         //sound_play();
  5115.         //return;
  5116.  
  5117.     printf("reinit sound\n");
  5118.     Sleep( 200);
  5119.  
  5120.         HRESULT r;
  5121.  
  5122.     WAVEFORMATEX wf = { };
  5123.     wf.wFormatTag = WAVE_FORMAT_PCM;
  5124.     wf.nSamplesPerSec = conf.sound.fq;
  5125.     wf.nChannels = 2;
  5126.     wf.wBitsPerSample = 16;
  5127.     wf.nBlockAlign = 4;
  5128.     wf.nAvgBytesPerSec = wf.nSamplesPerSec * wf.nBlockAlign;
  5129.     //-------------------------------------------------------------------------
  5130.     if (conf.sound.do_sound == do_sound_wave)
  5131.     {
  5132.         MMRESULT mmr;
  5133.         //---------------------------------------------------------------------
  5134.         if ((mmr = waveOutOpen( &hwo, WAVE_MAPPER, &wf, 0, 0, CALLBACK_NULL)) != MMSYSERR_NOERROR)
  5135.         {
  5136.             printrmm("waveOutOpen()", mmr);
  5137.             hwo = nullptr;
  5138.             goto sfail;
  5139.         }
  5140.         //---------------------------------------------------------------------
  5141.         wqhead = 0;
  5142.         wqtail = 0;
  5143.     }
  5144.     //-------------------------------------------------------------------------
  5145.     else if (conf.sound.do_sound == do_sound_ds)
  5146.     {
  5147.         //---------------------------------------------------------------------
  5148.         if ((r = DirectSoundCreate( nullptr, &ds, nullptr)) != DS_OK)
  5149.         {
  5150.             printrds("DirectSoundCreate()", r);
  5151.             //ЄєЄ яюЄюь ю°шсър DSERR_NODRIVER
  5152.             //if (r == DSERR_NODRIVER)
  5153.             //  goto reinit_again;      // эх яюьюурхЄ
  5154.             goto sfail;
  5155.         }
  5156.         //---------------------------------------------------------------------
  5157.         r = -1;
  5158.         //---------------------------------------------------------------------
  5159.         if (conf.sound.dsprimary)
  5160.             r = ds->SetCooperativeLevel( wnd, DSSCL_WRITEPRIMARY);
  5161.         //---------------------------------------------------------------------
  5162.         if (r != DS_OK)
  5163.         {
  5164.             r = ds->SetCooperativeLevel( wnd, DSSCL_NORMAL);
  5165.             conf.sound.dsprimary = 0;
  5166.         }
  5167.         //---------------------------------------------------------------------
  5168.         if (r != DS_OK)
  5169.         {
  5170.             printrds("IDirectSound::SetCooperativeLevel()", r);
  5171.             goto sfail;
  5172.         }
  5173.         //---------------------------------------------------------------------
  5174.         DSBUFFERDESC dsdesc = { sizeof(DSBUFFERDESC) };
  5175.         r = -1;
  5176.         //---------------------------------------------------------------------
  5177.         if (conf.sound.dsprimary)
  5178.         {
  5179.             dsdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_PRIMARYBUFFER;
  5180.             dsdesc.dwBufferBytes = 0;
  5181.             dsdesc.lpwfxFormat = nullptr;
  5182.             r = ds->CreateSoundBuffer( &dsdesc, &dsbf, nullptr);
  5183.             //-----------------------------------------------------------------
  5184.             if (r != DS_OK)
  5185.             {
  5186.                 printrds("IDirectSound::CreateSoundBuffer() [primary]", r);
  5187.             }
  5188.             //-----------------------------------------------------------------
  5189.             else
  5190.             {
  5191.                 r = dsbf->SetFormat( &wf);
  5192.                 //-------------------------------------------------------------
  5193.                 if (r != DS_OK)
  5194.                 {
  5195.                     printrds("IDirectSoundBuffer::SetFormat()", r);
  5196.                     goto sfail;
  5197.                 }
  5198.                 //-------------------------------------------------------------
  5199.                 DSBCAPS caps;
  5200.                 caps.dwSize = sizeof caps;
  5201.                 dsbf->GetCaps( &caps);
  5202.                 dsbuffer_sz = caps.dwBufferBytes;
  5203.             }
  5204.             //-----------------------------------------------------------------
  5205.         }
  5206.         //---------------------------------------------------------------------
  5207.         if (r != DS_OK)
  5208.         {
  5209.             dsdesc.lpwfxFormat = &wf;
  5210.             dsdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS;
  5211.             dsbuffer_sz = dsdesc.dwBufferBytes = DSBUFFER_SZ;
  5212.             //-----------------------------------------------------------------
  5213.             if ((r = ds->CreateSoundBuffer( &dsdesc, &dsbf, nullptr)) != DS_OK)
  5214.             {
  5215.                 printrds("IDirectSound::CreateSoundBuffer()", r);
  5216.                 goto sfail;
  5217.             }
  5218.             //-----------------------------------------------------------------
  5219.             conf.sound.dsprimary = 0;
  5220.         }
  5221.         //---------------------------------------------------------------------
  5222.         dsoffset = dsbuffer_sz / 4;
  5223.     }
  5224.     //-------------------------------------------------------------------------
  5225.     else
  5226.     {
  5227. sfail:
  5228.         conf.sound.do_sound = do_sound_none;
  5229.     }
  5230.    
  5231.    
  5232.     sound_play();
  5233. }
  5234.  
  5235.