Subversion Repositories pentevo

Rev

Rev 1088 | Blame | Compare with Previous | 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 "config.h"
  7. #include "draw.h"
  8. #include "dx.h"
  9. #include "debug.h"
  10. #include "memory.h"
  11. #include "sndrender/sndcounter.h"
  12. #include "sound.h"
  13. #include "savesnd.h"
  14. #include "tape.h"
  15. #include "gui.h"
  16. #include "leds.h"
  17. #include "snapshot.h"
  18. #include "fdd.h"
  19. #include "init.h"
  20. #include "z80.h"
  21. #include "emulkeys.h"
  22. #include "funcs.h"
  23. #include "util.h"
  24.  
  25. #include "input.h"
  26. #include "zxusbnet.h"
  27.  
  28.  
  29. #include "version.h"    // для окна about [NS]
  30.  
  31.  
  32. // вынесено в resource.h
  33. // static const DWORD SCU_SCALE1 = 0x10;
  34. // static const DWORD SCU_SCALE2 = 0x20;
  35. // static const DWORD SCU_SCALE3 = 0x30;
  36. // static const DWORD SCU_SCALE4 = 0x40;
  37. // static const DWORD SCU_LOCK_MOUSE = 0x50;
  38.  
  39.  
  40. //=============================================================================
  41. void main_pause()
  42. {
  43.         main_pause_flag ^= 1;  
  44.  
  45.         if (main_pause_flag == 0)
  46.         {
  47.                 //active = 1; //парализует менюшки
  48.                 adjust_mouse_cursor();
  49.                 sound_play();
  50.                 pause = 0;
  51.                 //OnExitGui(false);
  52.         }
  53.         else
  54.         {
  55.                 text_i(rbuf+temp.scx/2-8,"pause",0x0F); flip();
  56.                 pause = 1;
  57.                 sound_stop();
  58.                 updatebitmap(); // сохранение текущего изображения окна
  59.                                 // для востановления под окнами
  60.                 //active = 0;
  61.                 adjust_mouse_cursor(); 
  62.                 //OnEnterGui();
  63.                
  64.                 //clear_buffer();       //sound не тушим но чтоб не пищал
  65.                                         //не помогает
  66.                                         //крашитсо при SoundDrv = wave
  67.         }
  68.  
  69.  
  70. /*
  71. // нельзя вызывать в дебагере!!!!
  72.        
  73.    text_i(rbuf+temp.scx/2-8,"pause",0x0F); flip();
  74.  
  75.  
  76.                 if (pause == 1)
  77.                 {
  78.                 //printf ("pause when pause\n");
  79.                 pause = 0;
  80.                 return;
  81.                 }
  82.  
  83. //      printf ("pause when run\n");
  84.        
  85.         pause = 1;
  86.         sound_stop();
  87.         updatebitmap();
  88.         active = 0;
  89.         adjust_mouse_cursor();
  90.        
  91. //висит пока не наступит другое событие
  92.  
  93. //   while (!process_msgs()) Sleep(10);
  94. //   eat();
  95.  
  96.  
  97.                 while (!process_msgs())
  98.                 {
  99.                 Sleep(10);
  100.                         if (pause == 0) break;
  101.                 }
  102.  
  103. //      while (pause)
  104. //      {
  105. //      //dispatch(ac_main);
  106. //      process_msgs();         //обработка менюшек
  107. //  
  108. //      //eat();
  109. //      Sleep(10);
  110. //      //input.make_matrix(); //dispatch_more(ac_main); //dispatch(ac_main);
  111. //              if (kbdpc[DIK_PAUSE] == 1)
  112. //              {
  113. //              break;
  114. //              }
  115. //      }
  116.  
  117.  
  118.         eat();
  119.  
  120. //      printf ("end pause\n");
  121.    active = 1; adjust_mouse_cursor();
  122.    sound_play();
  123.    pause = 0;
  124.    
  125. */
  126. }
  127. //=============================================================================
  128.  
  129.  
  130. //=============================================================================
  131. void main_debug()
  132. {
  133.    Z80 &cpu = CpuMgr.Cpu();
  134.  
  135.    cpu.dbgchk = 1;      //debug cpu mode
  136.    cpu.dbgbreak = 1;
  137.    dbgbreak = 1;
  138. }
  139. //=============================================================================
  140.  
  141.  
  142. enum { FIX_FRAME = 0, FIX_LINE, FIX_PAPER, FIX_NOPAPER, FIX_HWNC, FIX_LAST };
  143. static const char *fix_titles[FIX_LAST] = {
  144.    "%d t-states / int",
  145.    "%d t-states / line",
  146.    "paper starts at %d",
  147.    "border only: %d",
  148.    "hardware mc: %d"
  149. };
  150.  
  151.  
  152. static unsigned char whatfix = 0, whatsnd = 0;
  153. static unsigned char fixmode = u8(-1U);
  154. static int mul0 = 100, mul1 = 1000;
  155.  
  156. //=============================================================================
  157. static void chfix(int dx)
  158. {
  159.    if (!fixmode) {
  160.       unsigned value;
  161.       switch (whatfix) {
  162.          case FIX_FRAME: value = (conf.frame = unsigned(int(conf.frame) + dx)); break;
  163.          case FIX_LINE: value = (conf.t_line = unsigned(int(conf.t_line) + dx)); break;
  164.          case FIX_PAPER: value = (conf.paper = unsigned(int(conf.paper) + dx)); break;
  165.          case FIX_NOPAPER: value = (conf.nopaper ^= dx?1:0); break;
  166.          case FIX_HWNC: value = (comp.pEFF7 ^= dx?EFF7_HWMC:0)? 1 : 0; break;
  167.          default: return;
  168.       }
  169.       video_timing_tables();
  170.       apply_sound(); // t/frame affects AY engine!
  171.       sprintf(statusline, fix_titles[whatfix], value); statcnt=50;
  172.       if (dx) conf.ula_preset = u8(-1U);
  173.       return;
  174.    }
  175.    if (fixmode != 1) return;
  176.  
  177.    dx = (dx > 0) ? 1 : ((dx < 0) ? -1 : 0);
  178.  
  179.    *statusline = 0; statcnt = 50;
  180.    switch (whatsnd) {
  181.       case 0:
  182.          conf.sound.ay_stereo = u8(int(conf.sound.ay_stereo)+dx+int(num_aystereo)) % num_aystereo;
  183.          sprintf(statusline, "Stereo preset: %s", aystereo[conf.sound.ay_stereo]);
  184.          break;
  185.       case 1:
  186.          if (dx) conf.sound.ay_samples ^= 1;
  187.          sprintf(statusline, "Digital Soundchip: %s", conf.sound.ay_samples? "yes" : "no");
  188.          break;
  189.       case 2:
  190.          conf.sound.ay_vols = u8(int(conf.sound.ay_vols)+int(num_ayvols)+dx) % num_ayvols;
  191.          sprintf(statusline, "Chip Table: %s", ayvols[conf.sound.ay_vols]);
  192.          break;
  193.       case 3:
  194.          conf.pal = unsigned(int(conf.pal)+dx);
  195.          if (conf.pal == conf.num_pals) conf.pal = 0;
  196.          if (conf.pal == -1U) conf.pal = conf.num_pals-1;
  197.          sprintf(statusline, "Palette: %s", pals[conf.pal].name);
  198.          video_color_tables();
  199.          return;
  200.    }
  201.    apply_sound();
  202. }
  203. //=============================================================================
  204.  
  205.  
  206. //=============================================================================
  207. void main_selectfix()
  208. {
  209.    if (!fixmode) whatfix = (whatfix+1) % FIX_LAST;
  210.    fixmode = 0; mul0 = 1; mul1 = 10;
  211.    if(whatfix == FIX_FRAME)
  212.    {
  213.        mul0 = 100;
  214.        mul1 = 1000;
  215.    }
  216.    chfix(0);
  217. }
  218. //=============================================================================
  219.  
  220.  
  221. //=============================================================================
  222. void main_selectsnd()
  223. {
  224.    if (fixmode==1) whatsnd = (whatsnd+1) & 3;
  225.    fixmode = 1;
  226.    chfix(0);
  227. }
  228. //=============================================================================
  229.  
  230.  
  231. void main_incfix() { chfix(mul0); }
  232. void main_decfix() { chfix(-mul0); }
  233. void main_incfix10() { chfix(mul1); }
  234. void main_decfix10() { chfix(-mul1); }
  235.  
  236.  
  237. //=============================================================================
  238. void main_leds()
  239. {
  240.    conf.led.enabled ^= 1;
  241.    sprintf(statusline, "leds %s", conf.led.enabled ? "on" : "off"); statcnt = 50;
  242. }
  243. //=============================================================================
  244.  
  245.  
  246. //=============================================================================
  247. void main_maxspeed()
  248. {
  249.    conf.sound.enabled ^= 1;
  250.    temp.frameskip = conf.sound.enabled? conf.frameskip : conf.frameskipmax;
  251.    if (conf.sound.enabled) sound_play(); else sound_stop();
  252.    sprintf(statusline, "Max speed: %s", conf.sound.enabled ? "NO" : "YES"); statcnt = 50;
  253. }
  254. //=============================================================================
  255.  
  256.  
  257. // select filter / driver through gui dialog ----------------------------
  258. //=============================================================================
  259. static INT_PTR CALLBACK filterdlg(HWND dlg, UINT msg, WPARAM wp, LPARAM lp)
  260. {
  261.    if (msg == WM_INITDIALOG)
  262.    {
  263.       HWND box = GetDlgItem(dlg, IDC_LISTBOX); int i;
  264.  
  265.       if (lp) {
  266.          for (i = 0; drivers[i].name; i++)
  267.             SendMessage(box, LB_ADDSTRING, 0, (LPARAM)drivers[i].name);
  268.          SendMessage(box, LB_SETCURSEL, conf.driver, 0);
  269.          SetWindowText(dlg, "Select driver for rendering");
  270.       } else {
  271.          for (i = 0; renders[i].name; i++)
  272.             SendMessage(box, LB_ADDSTRING, 0, (LPARAM)renders[i].name);
  273.          SendMessage(box, LB_SETCURSEL, conf.render, 0);
  274.       }
  275.  
  276.       RECT rcw, cli; GetWindowRect(box, &rcw); GetClientRect(box, &cli);
  277.       RECT rcd; GetWindowRect(dlg, &rcd);
  278.  
  279.       int nc_width = (rcw.right - rcw.left) - (cli.right - cli.left);
  280.       int nc_height = (rcw.bottom - rcw.top) - (cli.bottom - cli.top);
  281.       int dlg_w = (rcd.right - rcd.left) - (rcw.right - rcw.left);
  282.       int dlg_h = (rcd.bottom - rcd.top) - (rcw.bottom - rcw.top);
  283.       nc_width += 300;
  284.       nc_height += i*SendMessage(box, LB_GETITEMHEIGHT, 0, 0);
  285.       dlg_w += nc_width; dlg_h += nc_height;
  286.       SetWindowPos(box, nullptr, 0, 0, nc_width, nc_height, SWP_NOZORDER | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_SHOWWINDOW);
  287.  
  288.       GetWindowRect(wnd, &rcw);
  289.       SetWindowPos(dlg, nullptr,
  290.          rcw.left + ((rcw.right-rcw.left)-dlg_w)/2,
  291.          rcw.top + ((rcw.bottom-rcw.top)-dlg_h)/2,
  292.          dlg_w, dlg_h, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_SHOWWINDOW);
  293.  
  294.       SetFocus(box);
  295.       return FALSE;
  296.    }
  297.  
  298.    if ((msg == WM_COMMAND && wp == IDCANCEL) ||
  299.        (msg == WM_SYSCOMMAND && (wp & 0xFFF0) == SC_CLOSE))
  300.    {
  301.        EndDialog(dlg, -1);
  302.        return TRUE;
  303.    }
  304.  
  305.    if (msg == WM_COMMAND)
  306.    {
  307.       int control = LOWORD(wp);
  308.       if (control == IDOK || (control == IDC_LISTBOX && HIWORD(wp) == LBN_DBLCLK))
  309.       {
  310.          EndDialog(dlg, SendDlgItemMessage(dlg, IDC_LISTBOX, LB_GETCURSEL, 0, 0));
  311.          return TRUE;
  312.       }
  313.    }
  314.    return FALSE;
  315. }
  316. //=============================================================================
  317.  
  318.  
  319. //=============================================================================
  320. void main_selectfilter()
  321. {
  322.    OnEnterGui();
  323.    INT_PTR index = DialogBoxParam(hIn, MAKEINTRESOURCE(IDD_FILTER_DIALOG), wnd, filterdlg, 0);
  324.    eat();
  325.    if (index < 0)
  326.    {
  327.        OnExitGui();
  328.        return;
  329.    }
  330.    OnExitGui(false);
  331.    conf.render = unsigned(index);
  332.    sprintf(statusline, "Video: %s", renders[index].name); statcnt = 50;
  333.    apply_video(); eat();
  334. }
  335. //=============================================================================
  336.  
  337.  
  338. //=============================================================================
  339. void main_selectdriver()
  340. {
  341.     //printf("main_selectdriver\n");
  342.     if (!(dbgbreak))    // [NS] теперь можно выбирать из дебагера
  343.     {
  344.         if (!(temp.rflags & RF_DRIVER))
  345.         {
  346.             //printf("1\n");
  347.             strcpy(statusline, "Not available for this filter");
  348.             statcnt = 50;
  349.             return;
  350.         }
  351.     }
  352.     //-------------------------------------------------------------------------
  353.     OnEnterGui();
  354.     INT_PTR index = DialogBoxParam(hIn, MAKEINTRESOURCE(IDD_FILTER_DIALOG), wnd, filterdlg, 1);
  355.     eat();
  356.     //-------------------------------------------------------------------------
  357.     if (index < 0)
  358.     {
  359.         OnExitGui();
  360.         return;
  361.     }
  362.     //-------------------------------------------------------------------------
  363.     OnExitGui(false);
  364.     conf.driver = unsigned(index);
  365.     sprintf(statusline, "Render to: %s", drivers[index].name); statcnt = 50;
  366.     if (!(dbgbreak))    // [NS]
  367.     {
  368.         apply_video();
  369.     }
  370.     eat();
  371. }
  372. //=============================================================================
  373.  
  374. // ----------------------------------------------------------------------
  375.  
  376. //=============================================================================
  377. void main_poke()
  378. {
  379.     OnEnterGui();
  380.     DialogBox(      hIn,
  381.                     MAKEINTRESOURCE( IDD_POKE),
  382.                     wnd,
  383.                     pokedlg
  384.                 );
  385.     eat();
  386.     OnExitGui();
  387. }
  388. //=============================================================================
  389.  
  390.  
  391. //=============================================================================
  392. void main_starttape()
  393. {
  394.    //if (comp.tape.play_pointer) stop_tape(); else start_tape();
  395.  
  396.     (!comp.tape.stopped)  ?  stop_tape() :
  397.                              start_tape();
  398.  
  399. /*
  400.     // теперь в WM_INITMENU
  401.     //-------------------------------------------------------------------------
  402.     HMENU main_menu = GetMenu( wnd);
  403.     //-------------------------------------------------------------------------
  404.     if (main_menu)
  405.     {      
  406.         //---------------------------------------------------------------------
  407.         if (comp.tape.stopped)
  408.         {
  409.             ModifyMenu(     main_menu,
  410.                             IDM_TAPE_CONTROL,
  411.                             MF_BYCOMMAND | MF_STRING,
  412.                             IDM_TAPE_CONTROL,
  413.                             "Start Tape"
  414.                         );
  415.         }
  416.         //---------------------------------------------------------------------
  417.         else
  418.         {
  419.             ModifyMenu(     main_menu,
  420.                             IDM_TAPE_CONTROL,
  421.                             MF_BYCOMMAND | MF_STRING,
  422.                             IDM_TAPE_CONTROL,
  423.                             "Stop Tape"
  424.                         );
  425.         }
  426.         //---------------------------------------------------------------------
  427.     }
  428.     //-------------------------------------------------------------------------
  429.     */
  430.    
  431. }
  432. //=============================================================================
  433.  
  434.  
  435. //=============================================================================
  436. void main_tapebrowser()
  437. {
  438. #ifdef MOD_SETTINGS
  439.     lastpage = "TAPE";
  440.     setup_dlg();
  441. #endif
  442. }
  443. //=============================================================================
  444.  
  445.  
  446. //=============================================================================
  447. #ifndef MOD_SETTINGS
  448. void setup_dlg() {}
  449. #endif
  450. //=============================================================================
  451.  
  452.  
  453. //=============================================================================
  454. static const char *getrom(ROM_MODE page)
  455. {
  456.    switch (page) {
  457.       case RM_128: return "Basic 128";
  458.       case RM_SYS: return "Service ROM";
  459.       case RM_DOS: return "TR-DOS";
  460.       case RM_SOS: return "Basic 48";
  461.       case RM_CACHE: return "Cache";
  462.    }
  463.    return "???";
  464. }
  465. //=============================================================================
  466.  
  467.  
  468. //=============================================================================
  469. static void m_reset(ROM_MODE page)
  470. {
  471.     load_atm_font();
  472.  
  473.     sprintf(statusline, "Reset to %s", getrom(page));
  474.     statcnt = 50;
  475.    
  476.     input.buffer_enabled = false;       // DimkaM disable ps/2 access
  477.     input.buffer.Empty();               // NEDOREPO
  478.     //-------------------------------------------------------------------------
  479.     if (conf.atm620_xt_keyb)
  480.     {
  481.         input.atm620_xt_keyb_buffer_enabled = TRUE;     // [NS]
  482.         input.atm620_xt_keyb_buffer.Empty();            //
  483.     }
  484.     //-------------------------------------------------------------------------
  485.     nmi_pending = 0;
  486.     cpu.nmi_in_progress = false;
  487.     reset(page);
  488. }
  489. //=============================================================================
  490.  
  491.  
  492. //=============================================================================
  493. void main_reset128() { m_reset(RM_128); }
  494. void main_resetsys() { m_reset(RM_SYS); }
  495. void main_reset48() { m_reset(RM_SOS); comp.p7FFD = 0x30; comp.pEFF7 |= EFF7_LOCKMEM; /*Alone Coder*/}
  496. void main_resetbas() { m_reset(RM_SOS); }
  497. void main_resetdos() { if (conf.trdos_present) m_reset(RM_DOS); }
  498. void main_resetcache() { if (conf.cache) m_reset(RM_CACHE); }
  499. void main_reset() { m_reset((ROM_MODE)conf.reset_rom); }
  500. //=============================================================================
  501.  
  502.  
  503. //=============================================================================
  504. void m_nmi(ROM_MODE page)
  505. {
  506.         if(conf.mem_model == MM_ATM710 && bankr[(cpu.pc >> 14) & 3] >= RAM_BASE_M+PAGE*MAX_RAM_PAGES)
  507.         {               //NEDOREPO
  508.                 return;
  509.         }
  510.    set_mode(page);
  511.    sprintf(statusline, "NMI to %s", getrom(page)); statcnt = 50;
  512.    comp.p00 = 0; // quorum
  513.    cpu.sp -= 2;
  514.    if(cpu.DbgMemIf->rm(cpu.pc) == 0x76) // nmi on halt command
  515.        cpu.pc++;
  516.    cpu.DbgMemIf->wm(cpu.sp, cpu.pcl);
  517.    cpu.DbgMemIf->wm(cpu.sp+1, cpu.pch);
  518.    cpu.pc = 0x66; cpu.iff1 = cpu.halted = 0;
  519. }
  520. //=============================================================================
  521.  
  522.  
  523. //=============================================================================
  524. void main_nmi()
  525. {
  526.     nmi_pending  = 1;
  527.         trdos_in_nmi = comp.flags&CF_TRDOS;     //NEDOREPO
  528.     if(conf.mem_model != MM_ATM3)
  529.         m_nmi(RM_NOCHANGE);
  530. }
  531. //=============================================================================
  532.  
  533.  
  534. //=============================================================================
  535. void main_nmidos()
  536. {
  537.  if((conf.mem_model == MM_PROFSCORP || conf.mem_model == MM_SCORP) &&
  538.    !(comp.flags & CF_TRDOS) && cpu.pc < 0x4000)
  539.  {
  540.      nmi_pending = conf.frame * 50; // 50 * 20ms
  541.      return;
  542.  }
  543.  m_nmi(RM_DOS);
  544. }
  545. //=============================================================================
  546.  
  547.  
  548. //=============================================================================
  549. void main_nmicache() { m_nmi(RM_CACHE); }
  550. //=============================================================================
  551.  
  552.  
  553. //=============================================================================
  554. static void qsave(const char *fname) {
  555.    char xx[0x200]; addpath(xx, fname);
  556.    FILE *ff = fopen(xx, "wb");
  557.    if (ff) {
  558.        if(writeSNA(ff))
  559.        {
  560.            sprintf(statusline, "Quick save to %s", fname);
  561.            statcnt = 30;
  562.        }
  563.       fclose(ff);
  564.    }
  565. }
  566. //=============================================================================
  567. void qsave1() { qsave("qsave1.sna"); }
  568. void qsave2() { qsave("qsave2.sna"); }
  569. void qsave3() { qsave("qsave3.sna"); }
  570. //=============================================================================
  571. static void qload(const char *fname) {
  572.    char xx[0x200]; addpath(xx, fname);
  573.    if(loadsnap(xx))
  574.    {
  575.        sprintf(statusline, "Quick load from %s", fname);
  576.        statcnt = 30;
  577.    }
  578. }
  579. //=============================================================================
  580. void qload1() { qload("qsave1.sna"); }
  581. void qload2() { qload("qsave2.sna"); }
  582. void qload3() { qload("qsave3.sna"); }
  583. //=============================================================================
  584.  
  585.  
  586. //=============================================================================
  587. void main_keystick()
  588. {
  589.     input.keymode = (input.keymode == K_INPUT::KM_KEYSTICK)  ?  K_INPUT::KM_DEFAULT :
  590.                                                                 K_INPUT::KM_KEYSTICK;
  591. }
  592. //=============================================================================
  593.  
  594.  
  595. //=============================================================================
  596. void main_autofire()
  597. {
  598.     conf.input.fire ^= 1;
  599.     input.firedelay = 1;
  600.     sprintf(statusline, "autofire %s", conf.input.fire ? "on" : "off");
  601.     statcnt = 30;
  602. }
  603. //=============================================================================
  604.  
  605.  
  606. //=============================================================================
  607. void main_save()
  608. {
  609.    sound_stop();
  610.    if (conf.cmos)
  611.        save_nv();
  612.    unsigned char optype = 0;
  613.    for (int i = 0; i < 4; i++)
  614.    {
  615.       if (!comp.fdd[i].test())
  616.           return;
  617.       optype |= comp.fdd[i].optype;
  618.    }
  619.  
  620.    if(!optype)
  621.    {
  622.        sprintf(statusline, "all saved");
  623.        statcnt = 30;
  624.    }
  625. }
  626. //=============================================================================
  627.  
  628.  
  629. //=============================================================================
  630. void main_fullscr()
  631. {
  632.     //-------------------------------------------------------------------------
  633.     if (!(temp.rflags & (RF_GDI | RF_OVR | RF_CLIP | RF_D3D)))
  634.     {
  635.         sprintf( statusline, "only for overlay/gdi/nonexclusive modes");
  636.         statcnt = 30;
  637.     }
  638.     //-------------------------------------------------------------------------
  639.     else
  640.     {
  641.         conf.fullscr ^= 1;
  642.         apply_video();
  643.     }
  644.     //-------------------------------------------------------------------------
  645. }
  646. //=============================================================================
  647.  
  648.  
  649.  
  650.  
  651. //=============================================================================
  652. // toggle mouse - по факту
  653. void main_mouse()      
  654. {
  655. //      printf("mouse locked\n");       //срабатывает при клацание по экрану
  656.                                         //с захватом мыши с первого клика
  657.     conf.lockmouse ^= 1;
  658.     adjust_mouse_cursor();
  659.     sprintf( statusline, "mouse %slocked", conf.lockmouse ? nil : "un");
  660.     statcnt = 30;
  661. }
  662. //=============================================================================
  663. void main_unlock_mouse()                                                // [NS]
  664. {
  665.     //-------------------------------------------------------------------------
  666.     //printf("mouse unlocked\n");      
  667.     if (conf.lockmouse != 0)
  668.     {
  669.         conf.lockmouse = 0;
  670.         adjust_mouse_cursor();
  671.         sprintf( statusline, "mouse unlocked");
  672.         statcnt = 30;
  673.     }
  674.     //-------------------------------------------------------------------------
  675. }
  676. //=============================================================================
  677. void main_unlock_mouse_silent()                                         // [NS]
  678. {
  679.     //-------------------------------------------------------------------------
  680.     //printf("mouse unlocked\n");      
  681.     if (conf.lockmouse != 0)
  682.     {
  683.         conf.lockmouse = 0;
  684.         //adjust_mouse_cursor();
  685.     }
  686.     //-------------------------------------------------------------------------
  687. }
  688. //=============================================================================
  689.  
  690.  
  691.  
  692.  
  693. //=============================================================================
  694. void main_help()
  695. {
  696.     showhelp();
  697. }
  698. //-------------------------------------------------------------------------
  699. void mon_help()
  700. {
  701.     showhelp("monitor_keys");
  702. }
  703. //=============================================================================
  704.  
  705.  
  706.  
  707.  
  708.  
  709. //=============================================================================
  710. // скопипащено с Петзольдов
  711. intptr_t CALLBACK AboutDlgProc( HWND hDlg,
  712.                                 UINT iMsg,
  713.                                 WPARAM wParam,
  714.                                 LPARAM lParam
  715.                         )
  716. {
  717.     //-------------------------------------------------------------------------
  718.     switch(iMsg)
  719.     {
  720.         //---------------------------------------------------------------------
  721.         case WM_INITDIALOG:
  722.             return TRUE;
  723.         //---------------------------------------------------------------------
  724.         case WM_COMMAND :
  725.             //-----------------------------------------------------------------
  726.             switch( LOWORD( wParam))
  727.             {
  728.                 case IDOK:
  729.                 case IDCANCEL:
  730.                 EndDialog( hDlg, 0);
  731.                 return TRUE;
  732.             }
  733.             //-----------------------------------------------------------------
  734.             break;
  735.         //---------------------------------------------------------------------
  736.     }
  737.     //-------------------------------------------------------------------------
  738.     return FALSE;
  739. }
  740. //=============================================================================
  741.  
  742.  
  743.  
  744.  
  745. void main_about()
  746. {
  747.  
  748.  
  749. /*
  750.     char temp_string_1[128];
  751.     sprintf( temp_string_1, "Unreal_NS %s, %s",
  752.                                 UNREAL_NS_VERS_STRING,
  753.                                 __DATE__                );
  754.  
  755.     char temp_string_2[128];
  756.     sprintf( temp_string_1, "Based on UnrealSpeccy %s by DeathSoft merged with %s NedoPC repo\n",
  757.                                 VERS_STRING_,
  758.                                 NEDOREPO_VERS           );
  759.     char temp_string[256];
  760.     sprintf( temp_string,
  761.                 "%s\n\r\n\r%s",
  762.                         temp_string_1,
  763.                         temp_string_2                                   );
  764.  
  765.     MessageBox( wnd,
  766.                 temp_string,
  767.                 "blablabla",// 
  768.                 MB_OK | MB_ICONINFORMATION );
  769. */
  770.  
  771. /*
  772.     CreateDialog(       hIn,
  773.                 MAKEINTRESOURCE( IDD_ABOUT),
  774.                 wnd,
  775.                 AboutDlgProc
  776.         );
  777. */
  778.  
  779.     DialogBox(  hIn,
  780.                 MAKEINTRESOURCE( IDD_ABOUT),
  781.                 wnd,
  782.                 AboutDlgProc
  783.         );
  784.  
  785. }
  786.  
  787.  
  788. //=============================================================================
  789. void main_atmkbd()
  790. {
  791.     conf.atm.xt_kbd ^= 1;
  792.     //-------------------------------------------------------------------------
  793.     if (conf.atm.xt_kbd)
  794.     {
  795.         sprintf(statusline, "ATM mode on. emulator hotkeys disabled");
  796.     }
  797.     //-------------------------------------------------------------------------
  798.     else
  799.     {
  800.         sprintf(statusline, "ATM mode off");
  801.     }
  802.     //-------------------------------------------------------------------------
  803.     statcnt = 50;
  804. }
  805. //=============================================================================
  806. void main_pastetext() { input.paste(); }
  807. //=============================================================================
  808.  
  809.  
  810. //=============================================================================
  811. void wnd_resize( int scale)
  812. {
  813.     printf("wnd_resize()\n");
  814.  
  815.     // ресайз resize main windows сразу после старта
  816.     // и после смены видео режима/ входе в дебагер
  817.  
  818.     //-------------------------------------------------------------------------
  819.     if (conf.fullscr)
  820.     {
  821.         sprintf( statusline, "impossible in fullscreen mode");
  822.         statcnt = 50;
  823.         return;
  824.     }
  825.     //-------------------------------------------------------------------------
  826.     if (!scale)
  827.     {
  828.         ShowWindow( wnd, SW_MAXIMIZE);
  829.         return;
  830.     }
  831.    //-------------------------------------------------------------------------
  832.     ShowWindow( wnd, SW_RESTORE);
  833.    
  834.     LONG style = GetWindowLong( wnd, GWL_STYLE);
  835.     RECT rc =
  836.     {
  837.         0,
  838.         0,
  839.         (LONG(temp.ox) * scale),
  840.         (LONG(temp.oy) * scale)
  841.     };
  842.     //-------------------------------------------------------------------------
  843.     // printf("old cx %d\n",(rc.right - rc.left));
  844.     // printf("old cy %d\n",(rc.bottom - rc.top));
  845.  
  846.     // AdjustWindowRect(&rc, DWORD(style), 0);  //orig
  847.  
  848.     // нужно так чтобы как то получить высоту меню и учесть ее
  849.     // иначе hardware blitter режим не рисует ничего при старте
  850.     // пока не будет увеличение высоты окна до размера экрана
  851.     // при этом менюшка при маленьком экране может завернутсо в 2+? ряда !!!
  852.  
  853.     // вариант TSL-а, по моему, не спасал от менюшки в 2 строки
  854.     AdjustWindowRect( &rc, style, GetMenu( wnd) != 0 ); // TSL
  855.    
  856. //      printf("new cx %d\n",(rc.right - rc.left));
  857. //      printf("new cy %d\n",(rc.bottom - rc.top));
  858.        
  859.     //-------------------------------------------------------------------------
  860.     // ресайзим как нибудь (через Ж (пока хз как правильно такое делоть))
  861.     SetWindowPos(       wnd,
  862.                         nullptr,
  863.                         0,
  864.                         0,
  865.                         (rc.right - rc.left),
  866.                         (rc.bottom - rc.top),
  867.                             SWP_NOCOPYBITS              |
  868.                               SWP_NOMOVE                |
  869.                                 SWP_NOOWNERZORDER       |
  870.                                   SWP_NOZORDER
  871.                 );
  872.     //потом лучше еще потыкать всякие get system metrics или около того
  873.    
  874.     //-------------------------------------------------------------------------
  875.     // и смотрим что мы фактически наресайзили
  876.     RECT rct_Window;
  877.     GetWindowRect( wnd, &rct_Window);      
  878.     int win_size_x = rct_Window.right - rct_Window.left;
  879.     int win_size_y = rct_Window.bottom - rct_Window.top;
  880.    
  881.     RECT rct_Client;
  882.     GetClientRect( wnd, &rct_Client);
  883.     int clnt_size_x = rct_Client.right - rct_Client.left;
  884.     int clnt_size_y = rct_Client.bottom - rct_Client.top;
  885.  
  886.     int gap_size_x = win_size_x - clnt_size_x;
  887.     int gap_size_y = win_size_y - clnt_size_y;
  888.  
  889.     int new_size_x = gap_size_x + (LONG( temp.ox) * scale);
  890.     int new_size_y = gap_size_y + (LONG (temp.oy) * scale);
  891.        
  892.     //printf("final cx %d\n",(new_size_x));
  893.     //printf("final cy %d\n",(new_size_y));
  894.  
  895.     //-------------------------------------------------------------------------
  896.     // ресайзим уже как нада
  897.     // и походу НЕ иззо этого скачет размер окна в дебагере по Y
  898.     //  мало того окно там ресайзитсо 2 раза!!!! о_О
  899.     SetWindowPos(       wnd,
  900.                         nullptr,
  901.                         0,
  902.                         0,
  903.                         new_size_x,
  904.                         new_size_y,
  905.                             SWP_NOCOPYBITS              |
  906.                               SWP_NOMOVE                |
  907.                                 SWP_NOOWNERZORDER       |
  908.                                   SWP_NOZORDER
  909.                 );
  910.  
  911.     //-------------------------------------------------------------------------
  912.     // подмена масштабов в контекстном меню на актуальныые                 [NS]
  913.     char sys_x1[5]; char sys_x2[5]; char sys_x3[5]; char sys_x4[5];
  914.     //-------------------------------------------------------------------------
  915.     if (temp.rflags & RF_4X)
  916.     {
  917.         scale *= 4;     strcpy(sys_x1,"x4"); strcpy(sys_x2,"x8"); strcpy(sys_x3,"x12"); strcpy(sys_x4,"x16");
  918.     }
  919.     //-------------------------------------------------------------------------
  920.     else if (temp.rflags & RF_3X)
  921.     {
  922.         scale *= 3;     strcpy(sys_x1,"x3"); strcpy(sys_x2,"x6"); strcpy(sys_x3,"x9"); strcpy(sys_x4,"x12");
  923.     }
  924.     //-------------------------------------------------------------------------
  925.     else if (temp.rflags & RF_2X)
  926.     {
  927.         scale *= 2;     strcpy(sys_x1,"x2"); strcpy(sys_x2,"x4"); strcpy(sys_x3,"x6"); strcpy(sys_x4,"x8");
  928.     }
  929.     //-------------------------------------------------------------------------
  930.     else if (temp.rflags & RF_1X)
  931.     {
  932.                         strcpy(sys_x1,"x1"); strcpy(sys_x2,"x2"); strcpy(sys_x3,"x3"); strcpy(sys_x4,"x4");
  933.     }
  934.     //-------------------------------------------------------------------------
  935.     HMENU sys = GetSystemMenu( wnd, FALSE);     //0);
  936.     //-------------------------------------------------------------------------
  937.     if (sys)
  938.     {
  939.         // доки на ModifyMenu нету! сделано по аналогии с InsertMenu !!!
  940. //      ModifyMenu( sys, 2, MF_BYPOSITION | MF_STRING, SCU_SCALE1, sys_x1);
  941. //      ModifyMenu( sys, 3, MF_BYPOSITION | MF_STRING, SCU_SCALE2, sys_x2);
  942. //      ModifyMenu( sys, 4, MF_BYPOSITION | MF_STRING, SCU_SCALE3, sys_x3);
  943. //      ModifyMenu( sys, 5, MF_BYPOSITION | MF_STRING, SCU_SCALE4, sys_x4);
  944.  
  945.         // так не нужно знать положение
  946.         ModifyMenu( sys, SCU_SCALE1, MF_BYCOMMAND | MF_STRING, SCU_SCALE1, sys_x1);
  947.         ModifyMenu( sys, SCU_SCALE2, MF_BYCOMMAND | MF_STRING, SCU_SCALE2, sys_x2);
  948.         ModifyMenu( sys, SCU_SCALE3, MF_BYCOMMAND | MF_STRING, SCU_SCALE3, sys_x3);
  949.         ModifyMenu( sys, SCU_SCALE4, MF_BYCOMMAND | MF_STRING, SCU_SCALE4, sys_x4);
  950.         //---------------------------------------------------------------------
  951.         HMENU main_menu = GetMenu( wnd);
  952.         //---------------------------------------------------------------------
  953.         if (main_menu)
  954.         {
  955.             ModifyMenu( main_menu, IDM_SCALE1, MF_BYCOMMAND | MF_STRING, IDM_SCALE1, sys_x1);
  956.             ModifyMenu( main_menu, IDM_SCALE2, MF_BYCOMMAND | MF_STRING, IDM_SCALE2, sys_x2);
  957.             ModifyMenu( main_menu, IDM_SCALE3, MF_BYCOMMAND | MF_STRING, IDM_SCALE3, sys_x3);
  958.             ModifyMenu( main_menu, IDM_SCALE4, MF_BYCOMMAND | MF_STRING, IDM_SCALE4, sys_x4);
  959.         }
  960.         //---------------------------------------------------------------------
  961.     }
  962.     //-------------------------------------------------------------------------
  963.     // печатаем фактический масштаб
  964.     sprintf(    statusline,
  965.                 "scale: %dx",
  966.                 scale
  967.             );
  968.     statcnt = 50;
  969. }
  970. //=============================================================================
  971. void main_size1() { wnd_resize(1); }
  972. void main_size2() { wnd_resize(2); }
  973. void main_sizem() { wnd_resize(0); }
  974. //=============================================================================
  975.  
  976.  
  977. //=============================================================================
  978. static void SetBorderSize(unsigned BorderSize)
  979. {
  980. // 0 - none
  981. // 1 - small
  982. // 2 - wide
  983. // 3 - full
  984.     //-------------------------------------------------------------------------
  985.     if (BorderSize > 3)
  986.     {
  987.         return;
  988.     }
  989.     //-------------------------------------------------------------------------
  990.     conf.bordersize = u8(BorderSize);
  991.     apply_video();
  992. }
  993. //=============================================================================
  994. void main_border_none()  { SetBorderSize(0); }
  995. void main_border_small() { SetBorderSize(1); }
  996. void main_border_full()  { SetBorderSize(2); }  //wide на самом деле
  997. //=============================================================================
  998.  
  999.  
  1000. //=============================================================================
  1001. void correct_exit()
  1002. {
  1003.     sound_stop();
  1004.    
  1005.     //-------------------------------------------------------------------------
  1006.     if (conf.wiznet)            //NEDOREPO
  1007.         Wiz5300_Close();        
  1008.     //-------------------------------------------------------------------------
  1009.     if (!done_fdd(true))
  1010.         return;
  1011.     //-------------------------------------------------------------------------
  1012.     nowait = 1;
  1013.     normal_exit = true;
  1014.     exit();
  1015. }
  1016. //=============================================================================
  1017.  
  1018.  
  1019. //=============================================================================
  1020. void opensnap()
  1021. {
  1022.     OnEnterGui();
  1023.     opensnap(0);
  1024.     eat();
  1025.     OnExitGui();
  1026. }
  1027. //=============================================================================
  1028.  
  1029.  
  1030. //=============================================================================
  1031. void savesnap()
  1032. {
  1033.     OnEnterGui();
  1034.     savesnap(-1);
  1035.     eat();
  1036.     OnExitGui();
  1037. }
  1038. //=============================================================================
  1039.