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 "emul.h"
  4. #include "vars.h"
  5. #include "draw.h"
  6. #include "dx.h"
  7. #include "debug.h"
  8. #include "dbgpaint.h"
  9. #include "dbgreg.h"
  10. #include "dbgtrace.h"
  11. #include "dbgmem.h"
  12. #include "dbgoth.h"
  13. #include "dbglabls.h"
  14. #include "dbgbpx.h"
  15.  
  16. #include "util.h"
  17.  
  18. #include "resource.h"   // [NS] фы  ьхэ■°хъ    
  19. #include "dbgrwdlg.h"   // [NS] фы  т√чютр block load/save/fill
  20. #include "dbgcmd.h"     // [NS] memory dump toggle - ъюэЇышъЄютрыю!
  21. #include "z80asm.h"     // [NS] фы  ёьхэ√ ёЄшы  фшчрёьр
  22. #include "emulkeys.h"   // [NS] фы  юЄъы■ўхэш  чрїтрЄр ь√°ш
  23.  
  24. #ifdef MOD_MONITOR
  25.  
  26. unsigned char trace_labels;
  27.  
  28. unsigned show_scrshot;
  29. unsigned user_watches[3] = { 0x4000, 0x8000, 0xC000 };
  30.  
  31. unsigned mem_sz = 8;
  32.  
  33. unsigned mem_disk;
  34. unsigned mem_track;
  35. unsigned mem_max;
  36.  
  37. unsigned char mem_ascii;
  38. unsigned char mem_dump;
  39. unsigned char editor = ED_MEM;
  40.  
  41. unsigned regs_curs;
  42. unsigned dbg_extport;
  43. unsigned char dbg_extval;       // extended memory port like 1FFD or DFFD
  44.  
  45. unsigned ripper;                // ripper mode (none/read/write)
  46.  
  47. int dbg_force_exit;             // фы  ъюёЄ√ы№эюую т√їюфр шч фхсрухЁр   [NS]
  48.                                 // схч фюяюыэшЄхы№эюую рэшъх 
  49.                        
  50. DBGWND activedbg = WNDTRACE;
  51.  
  52. void debugscr();
  53.  
  54. //unsigned find1dlg(unsigned start);    //эртхЁэю       - єфрыхэю Єъ ъюэЇышъЄєхЄ
  55. //unsigned find2dlg(unsigned start);    //ЁєфшьхэЄ√     - [NS]
  56.  
  57. /*
  58. #include "dbgpaint.cpp"
  59. #include "dbglabls.cpp"
  60. #include "z80asm.cpp"
  61. #include "dbgreg.cpp"
  62. #include "dbgmem.cpp"
  63. #include "dbgtrace.cpp"
  64. #include "dbgrwdlg.cpp"
  65. #include "dbgcmd.cpp"
  66. #include "dbgbpx.cpp"
  67. #include "dbgoth.cpp"
  68. */
  69.  
  70. //              paper ink
  71. //              Bgrb Bgrb
  72. //=============================================================================
  73. void debugscr()
  74. {
  75.  
  76. #define DBG_ATTR_PANEL  0x50   
  77.  
  78.  
  79.    //чрыштър Їюэр °рїьрЄъющ
  80.    memset(      txtscr,
  81.                 ' ',                    //BACKGR_CH,    //ёшьтюы °рїьрЄъш эр Їюэх фхсрухЁр
  82.                 sizeof txtscr/2
  83.           );
  84.    memset(      txtscr+sizeof txtscr/2,
  85.                 DBG_ATTR_PANEL,         //BACKGR,       //рЄЁшсєЄ °рїьрЄъш
  86.                 sizeof txtscr/2
  87.           );
  88.    nfr = 0;
  89.  
  90.     showregs();         // юъэю ЁхушёЄЁют       chkd
  91.     showtrace();        // юъэю фшчрёьр         chkd
  92.     showmem();          // юъэю ьхьюЁш тшхтхЁр  chkd
  93.     showwatch();
  94.     showstack();
  95.     show_ay();
  96.     showbanks();
  97.     showports();
  98.     showdos();
  99.  
  100.     show_time();        //time delta тэшчє ¤ъЁрэр
  101.    
  102. //#if 0
  103.    
  104. //#else // фюшёЄюЁшўхёър  Ёрьюўър ё эрчтрэшхь хсєы ЄюЁр тьхёЄю
  105. //   tprint(copy_x, copy_y, "\x1A", 0x9C);
  106. //   tprint(copy_x+1, copy_y, "UnrealSpeccy " VERS_STRING, 0x9E);
  107. //   tprint(copy_x+20, copy_y, "by SMT", 0x9D);
  108. //   tprint(copy_x+26, copy_y, "\x1B", 0x9C);
  109. //   frame(copy_x, copy_y, 27, 1, 0x0A);
  110. //#endif
  111. }
  112. //=============================================================================
  113.  
  114.  
  115. //=============================================================================
  116. static void handle_mouse()
  117. {
  118.     Z80 &cpu = CpuMgr.Cpu();
  119.                 //printf("mousepos %x\n",mousepos);
  120.                 //printf("temp.gx %x\n",temp.gx);
  121.                 //printf("temp.gy %x\n",temp.gy);
  122.                 //
  123.                 //printf("temp.ox %d\n",temp.ox);
  124.                 //printf("temp.oy %d\n",temp.oy);
  125.  
  126. // unsigned     mx = ((mousepos & 0xFFFF) - temp.gx) / 8;               //orig
  127. // unsigned     my = (((mousepos >> 16) & 0x7FFF) - temp.gy) / 16;
  128.  
  129.  
  130. // temp.ox ═┼ ╘└╩╥╚╫┼╤╩╚╔ ╨└╟╠┼╨ !!!!
  131.  
  132.     RECT current_mainwnd_size;
  133.     GetClientRect( wnd, &current_mainwnd_size);
  134.     int real_dbg_wnd_size_x = current_mainwnd_size.right - current_mainwnd_size.left;
  135.     int real_dbg_wnd_size_y = current_mainwnd_size.bottom - current_mainwnd_size.top;
  136.     // real_dbg_wnd_size_y т√эхёЄш т юЄфхы№эє■ яхЁхьхээє■
  137.     // ўЄюс√ эх фхырЄ№ GetClientRect !!!
  138.     // new_wnd_size_x фЁєуюх шь 
  139.    
  140. //      printf("temp.gx %d\n",temp.gx);
  141. //      printf("temp.gy %d\n",temp.gy);
  142. //      printf("real_dbg_wnd_size_x %d\n", real_dbg_wnd_size_x);
  143. //      printf("real_dbg_wnd_size_y %d\n", real_dbg_wnd_size_y);
  144. //ъюЁхъЄшЁєхь ъююЁфшэрЄ√ ы■сюую юъэр фю фхсрухЁэ√ї 640ї480              [NS]
  145. //    unsigned  mx = (float) (( mousepos & 0xFFFF) - temp.gx) *          ((float) (s640) / (float) (real_dbg_wnd_size_x)) ;
  146. //              mx /= 8;        //ЁрчьхЁ °ЁшЇЄр
  147. //    unsigned  my = (float) (((( mousepos >> 16) & 0x7FFF) - temp.gy)) * ((float) (s480) / (float) (real_dbg_wnd_size_y)) ;
  148. //              my /= 16;       //ЁрчьхЁ °ЁшЇЄр
  149.  
  150. // temp.gx эртхЁэюх єцх эх эєцхэ (ьх°рхЄ т√ўшёы Є№ т ЁрёЄ эЄюьь Ёхцшьх)
  151. // ¤Єю эртхЁэю юёЄрыюё№ юЄ ЎхэЄЁютрэш  фхсрухЁр яюю ЎхэЄЁє
  152.     unsigned    mx = (float) (( mousepos & 0xFFFF)) *           ((float) (s640) / (float) (real_dbg_wnd_size_x)) ;
  153.                 mx /= 8;        //ЁрчьхЁ °ЁшЇЄр
  154.     unsigned    my = (float) (((( mousepos >> 16) & 0x7FFF))) * ((float) (s480) / (float) (real_dbg_wnd_size_y)) ;
  155.                 my /= 16;       //ЁрчьхЁ °ЁшЇЄр
  156.  
  157. //      printf("mx %d\n",mx);
  158. //      printf("my %d\n",my);
  159.  
  160.  
  161.  
  162.  
  163. // яхЁхяшёрЄ№ ёЄрЁ√х рфЁхёр ъююЁфшэрЄ эр фхЇрщэ√ шч debug.h
  164.  
  165.     // ьюцхЄ ыєў°ю тююс∙х юЁурэшчютрЄ№ ёЄхэёшы сєЇхЁ?
  166.     // ш т ьхёЄх ё юЄЁшёютъющ уЁрЇшъш (т Єюь ўшёых фтшурсхыы№эющ)
  167.     // хую чряюыэ Є№
  168.     //-------------------------------------------------------------------------
  169.     // Ports window                                     // [NS]
  170.     if (        (my >= ports_y)                 &&
  171.                 (my < (ports_y + ports_cy) )    &&
  172.                 (mx >= ports_x)                 &&
  173.                 (mx < (ports_x + ports_cx) )
  174.      )
  175.     {
  176.         activedbg = WND_PORTS;
  177.         needclr++;
  178.         //printf("ports window detect\n");
  179.     }
  180.     //-------------------------------------------------------------------------
  181.     // Stack window                                     // [NS]
  182.     if (        (my >= stack_y)                 &&
  183.                 (my < (stack_y + stack_cy) )    &&
  184.                 (mx >= stack_x)                 &&
  185.                 (mx < (stack_x + stack_cx) )
  186.       )
  187.     {
  188.         activedbg = WND_STACK;
  189.         needclr++;
  190.         //printf("WND_STACK window detect\n");
  191.     }
  192.     //-------------------------------------------------------------------------
  193.     // AY window                                        // [NS]
  194.     if (        (my >= ay_y)            &&
  195.                 (my < (ay_y + ay_cy) )  &&
  196.                 (mx >= ay_x)            &&
  197.                 (mx < (ay_x + ay_cx) )
  198.      )
  199.     {
  200.         activedbg = WND_AY;
  201.         needclr++;
  202.         //printf("WND_AY window detect\n");
  203.     }
  204.     //-------------------------------------------------------------------------
  205.     // Time Delta                                       // [NS]
  206.     if (        (my >= time_y)                  &&
  207.                 (my < (time_y + time_cy) )      &&
  208.                 (mx >= time_x)                  &&
  209.                 (mx < (time_x + time_cx) )
  210.       )
  211.     {
  212.         activedbg = WND_TIME_DELTA;
  213.         needclr++;
  214.         //printf("WND_TIME_DELTA window detect\n");
  215.     }
  216.     //-------------------------------------------------------------------------
  217.     // Pages                                            // [NS]
  218.     if (        (my >= banks_y)                 &&
  219.                 (my < (banks_y + banks_cy) )    &&
  220.                 (mx >= banks_x)                 &&
  221.                 (mx < (banks_x + banks_cx) )
  222.      )
  223.     {
  224.         activedbg = WND_PAGES;
  225.         needclr++;
  226.         //printf("WND_PAGES window detect\n");
  227.     }
  228.     //-------------------------------------------------------------------------
  229.     // Beta 128                                         // [NS]
  230.     if (        (my >= dos_y)                   &&
  231.                 (my < (dos_y + dos_cy) )        &&
  232.                 (mx >= dos_x)                   &&
  233.                 (mx < (dos_x + dos_cx) )
  234.      )
  235.     {
  236.         activedbg = WND_BETA128;
  237.         needclr++;
  238.         //printf("WND_BETA128 window detect\n");
  239.     }
  240.     //-------------------------------------------------------------------------
  241.     // Watches                                          // [NS]
  242.     if (        (my >= wat_y)                   &&
  243.                 (my < (wat_y + wat_cy) )        &&
  244.                 (mx >= wat_x)                   &&
  245.                 (mx < (wat_x + wat_cx) )
  246.      )
  247.     {
  248.         activedbg = WND_WATCHES;
  249.         needclr++;
  250.         //printf("WND_WATCHES window detect\n");
  251.     }
  252.     //-------------------------------------------------------------------------
  253.     //  Trace window
  254.     if (        (my >= trace_y)                 &&
  255.                 (my < (trace_y + trace_size))   &&
  256.                 (mx >= trace_x)                 &&
  257.                 (mx < trace_x + 32)                     // magic number !!!!!
  258.      )
  259.     {
  260.         activedbg = WNDTRACE;
  261.         needclr++;
  262.         //printf("trace window detect\n");
  263.        
  264.         cpu.trace_curs = cpu.trpc[ my - trace_y];
  265.         //printf("cpu.trace_curs %X\n",cpu.trace_curs);
  266.         //---------------------------------------------------------------------
  267.         if      (mx - trace_x < cs[1][0])       cpu.trace_mode = 0;     // addr
  268.         //---------------------------------------------------------------------
  269.         else if (mx - trace_x < cs[2][0])       cpu.trace_mode = 1;     // dump/labels
  270.         //---------------------------------------------------------------------
  271.         else                                    cpu.trace_mode = 2;     // disasm
  272.         //---------------------------------------------------------------------
  273.     }
  274.     //-------------------------------------------------------------------------
  275.     //  Memory window
  276.     if (        (my >= mem_y)                   &&
  277.                 (my < (mem_y + mem_size))       &&
  278.                 (mx >= mem_x)                   &&
  279.                 (mx < (mem_x + 37))                     // magic number !!!!
  280.      )
  281.     {
  282.         activedbg = WNDMEM;
  283.         needclr++;
  284.         //printf("mem window detect\n");       
  285.  
  286.         unsigned dx = mx - mem_x;
  287.        
  288.         //printf("my %d  mx %d  dx %d\n",my,mx,dx);
  289.         //---------------------------------------------------------------------
  290.         //Є√ърэшх яю рфЁхёє
  291.         if (dx < 5)
  292.         {
  293.             //-----------------------------------------------------------------
  294.             if (mem_dump)
  295.             {
  296.                 cpu.mem_curs = cpu.mem_top + (my - mem_y) * 32;
  297.             }
  298.             //-----------------------------------------------------------------
  299.             else
  300.             {
  301.                 cpu.mem_curs = cpu.mem_top + (my - mem_y) * 8;
  302.             }
  303.             //-----------------------------------------------------------------
  304.             cpu.mem_addr_edit_mode = 1;
  305.         }
  306.         //---------------------------------------------------------------------
  307.         // Є√ърэшх яю фрьяє
  308.         // т√фрхЄ ъюэъЁхЄэ√щ рфЁхё ъєфр ЄъэєЄю ъєЁёюЁюь
  309.         //
  310.         // ascii dump  
  311.         if (mem_dump)  
  312.         {
  313.             //-----------------------------------------------------------------
  314.             if (dx >= 5)
  315.             {
  316.                 cpu.mem_curs = cpu.mem_top + (dx - 5) + (my - mem_y) * 32;
  317.                 cpu.mem_addr_edit_mode = 0;
  318.             }
  319.             //-----------------------------------------------------------------
  320.         }
  321.         //---------------------------------------------------------------------
  322.         // hex+ascii dump
  323.         else   
  324.         {
  325.             unsigned mem_se = (dx - 5) % 3;
  326.             //-----------------------------------------------------------------
  327.             // ascii
  328.             if (dx >= 29)
  329.             {
  330.                 cpu.mem_curs = cpu.mem_top + (dx - 29) + (my - mem_y) * 8;
  331.                 mem_ascii = 1;
  332.                 cpu.mem_addr_edit_mode = 0;
  333.             }
  334.             //-----------------------------------------------------------------
  335.             // hex
  336.             if (        (dx >= 5)       &&
  337.                         (mem_se != 2)   &&
  338.                         (dx < 29)
  339.              )
  340.             {
  341.                 cpu.mem_curs = cpu.mem_top + (dx - 5) / 3 + (my - mem_y) * 8;
  342.                 cpu.mem_second = mem_se;
  343.                 mem_ascii = 0;
  344.                 cpu.mem_addr_edit_mode = 0;
  345.             }
  346.             //-----------------------------------------------------------------
  347.         }
  348.         //---------------------------------------------------------------------
  349.         //printf("cpu.mem_curs %x\n",cpu.mem_curs);
  350.     }
  351.     //-------------------------------------------------------------------------
  352.     // Regs window
  353.     if (        (mx >= regs_x)          &&
  354.                 (my >= regs_y)          &&
  355.                 (mx < (regs_x + 32))    &&
  356.                 (my < (regs_y + 4))
  357.      )
  358.     {
  359.         activedbg = WNDREGS;
  360.         needclr++;
  361.         //printf("regs window detect\n");
  362.         //---------------------------------------------------------------------
  363.         // юяЁхфхыхэшх яю ъръюьє regs_layout эюьхЁє ЁхушёЄЁр Є√ъэєЄю
  364.         for (unsigned i = 0;    i < regs_layout_count;    i++)
  365.         {
  366.             unsigned delta = 1; // фхЇюыЄэр  °шЁшэ√ Ёхуют фы  фхЄхъЎшш
  367.             //-----------------------------------------------------------------
  368.             if (regs_layout[i].width == DEC_6T) delta = 6;      // [NS] фы  ЄръЄют
  369.             //-----------------------------------------------------------------
  370.             if (regs_layout[i].width == HEX_16) delta = 4;
  371.             //-----------------------------------------------------------------
  372.             if (regs_layout[i].width == HEX_8)  delta = 2;
  373.             //-----------------------------------------------------------------
  374.             if (   (my - regs_y == regs_layout[i].y)            &&
  375.                    ((mx - regs_x - regs_layout[i].x) < delta)
  376.              )
  377.             {
  378.                 regs_curs = i;
  379.             }
  380.             //-----------------------------------------------------------------
  381.         }
  382.         //---------------------------------------------------------------------
  383.     }
  384.     //-------------------------------------------------------------------------
  385.     //printf("regs_curs %d\n",regs_curs);
  386.  
  387.  
  388.  
  389.    
  390.  
  391.  
  392.  
  393.  
  394.     //=========================================================================
  395.     // Right click
  396.     if (mousepos & 0x80000000)
  397.     {
  398.         //---------------------------------------------------------------------
  399.         // ъюёЄ√ы№ [NS]                 // ЇюЁёшЁєхь яхЁхЁшёютъє фхсрухЁр
  400.         debugscr();      //ЁшёютрЄ№     // ўЄюс√ ръЄштэюх юъэю т√фхышыюё№ Ёрэ№°х
  401.         debugflip(); //яхЁхъшф√трЄ№     // ўхь тёяы√тхЄ ъюэЄхъёэюх ьхэ■ шэрўх
  402.         //needclr--;                    // т√фхыхэшх Єюы№ъю яюёых чръЁ√Єш  ъюэЄхъёэюую ьхэ■!!! 
  403.         //---------------------------------------------------------------------
  404.  
  405.         // enum { IDM_MON_BPX = 1, IDM_SOME_OTHER };    // ╪╬╟└╒═▀??? ╬_ю  !!!!!!!
  406.  
  407.         int temp_mf_flag;
  408.        
  409.         //=====================================================================
  410.         // WNDTRACE - View - sub menu
  411.         //=====================================================================
  412.         HMENU wnd_trace_view_sub_menu = CreatePopupMenu();
  413.        
  414.         AppendMenu( wnd_trace_view_sub_menu, MF_STRING, IDM_MON_VIEW_AF  ,      "AF"    );
  415.         AppendMenu( wnd_trace_view_sub_menu, MF_STRING, IDM_MON_VIEW_BC  ,      "BC"    );
  416.         AppendMenu( wnd_trace_view_sub_menu, MF_STRING, IDM_MON_VIEW_DE  ,      "DE"    );
  417.         AppendMenu( wnd_trace_view_sub_menu, MF_STRING, IDM_MON_VIEW_HL  ,      "HL"    );
  418.         AppendMenu( wnd_trace_view_sub_menu, MF_SEPARATOR, 0, nullptr); //----------------------
  419.         AppendMenu( wnd_trace_view_sub_menu, MF_STRING, IDM_MON_VIEW_AF1 ,      "AF\'"  );
  420.         AppendMenu( wnd_trace_view_sub_menu, MF_STRING, IDM_MON_VIEW_BC1 ,      "BC\'"  );
  421.         AppendMenu( wnd_trace_view_sub_menu, MF_STRING, IDM_MON_VIEW_DE1 ,      "DE\'"  );     
  422.         AppendMenu( wnd_trace_view_sub_menu, MF_STRING, IDM_MON_VIEW_HL1 ,      "HL\'"  );
  423.         AppendMenu( wnd_trace_view_sub_menu, MF_SEPARATOR, 0, nullptr); //----------------------
  424.         AppendMenu( wnd_trace_view_sub_menu, MF_STRING, IDM_MON_VIEW_IX  ,      "IX"    );
  425.         AppendMenu( wnd_trace_view_sub_menu, MF_STRING, IDM_MON_VIEW_IY  ,      "IY"    );
  426.         AppendMenu( wnd_trace_view_sub_menu, MF_SEPARATOR, 0, nullptr); //----------------------
  427.         AppendMenu( wnd_trace_view_sub_menu, MF_STRING, IDM_MON_VIEW_SP  ,      "SP"    );
  428.         AppendMenu( wnd_trace_view_sub_menu, MF_STRING, IDM_MON_VIEW_PC  ,      "PC"    );
  429.         //=====================================================================
  430.         // WNDTRACE - Goto - sub menu
  431.         //=====================================================================
  432.         HMENU wnd_trace_goto_sub_menu = CreatePopupMenu();
  433.        
  434.         AppendMenu( wnd_trace_goto_sub_menu, MF_STRING, IDM_MON_GOTO_AF  ,      "AF"    );
  435.         AppendMenu( wnd_trace_goto_sub_menu, MF_STRING, IDM_MON_GOTO_BC  ,      "BC"    );
  436.         AppendMenu( wnd_trace_goto_sub_menu, MF_STRING, IDM_MON_GOTO_DE  ,      "DE"    );
  437.         AppendMenu( wnd_trace_goto_sub_menu, MF_STRING, IDM_MON_GOTO_HL  ,      "HL"    );
  438.         AppendMenu( wnd_trace_goto_sub_menu, MF_SEPARATOR, 0, nullptr); //----------------------
  439.         AppendMenu( wnd_trace_goto_sub_menu, MF_STRING, IDM_MON_GOTO_AF1 ,      "AF\'"  );
  440.         AppendMenu( wnd_trace_goto_sub_menu, MF_STRING, IDM_MON_GOTO_BC1 ,      "BC\'"  );
  441.         AppendMenu( wnd_trace_goto_sub_menu, MF_STRING, IDM_MON_GOTO_DE1 ,      "DE\'"  );     
  442.         AppendMenu( wnd_trace_goto_sub_menu, MF_STRING, IDM_MON_GOTO_HL1 ,      "HL\'"  );
  443.         AppendMenu( wnd_trace_goto_sub_menu, MF_SEPARATOR, 0, nullptr); //----------------------
  444.         AppendMenu( wnd_trace_goto_sub_menu, MF_STRING, IDM_MON_GOTO_IX  ,      "IX"    );
  445.         AppendMenu( wnd_trace_goto_sub_menu, MF_STRING, IDM_MON_GOTO_IY  ,      "IY"    );
  446.         AppendMenu( wnd_trace_goto_sub_menu, MF_SEPARATOR, 0, nullptr); //----------------------
  447.         AppendMenu( wnd_trace_goto_sub_menu, MF_STRING, IDM_MON_GOTO_SP  ,      "SP"    );
  448.         AppendMenu( wnd_trace_goto_sub_menu, MF_STRING, IDM_MON_GOTO_PC  ,      "PC"    );
  449.         //=====================================================================
  450.         // WNDTRACE - Follow - sub menu
  451.         //=====================================================================
  452.         HMENU wnd_trace_follow_sub_menu = CreatePopupMenu();
  453.        
  454.         temp_mf_flag = MF_STRING | ((conf.trace_follow_regs == REG_AF) ? MF_CHECKED : MF_UNCHECKED);           
  455.         AppendMenu( wnd_trace_follow_sub_menu, temp_mf_flag, IDM_MON_FOLLOW_AF  ,       "AF"    );
  456.        
  457.         temp_mf_flag = MF_STRING | ((conf.trace_follow_regs == REG_BC) ? MF_CHECKED : MF_UNCHECKED);   
  458.         AppendMenu( wnd_trace_follow_sub_menu, temp_mf_flag, IDM_MON_FOLLOW_BC  ,       "BC"    );
  459.                
  460.         temp_mf_flag = MF_STRING | ((conf.trace_follow_regs == REG_DE) ? MF_CHECKED : MF_UNCHECKED);   
  461.         AppendMenu( wnd_trace_follow_sub_menu, temp_mf_flag, IDM_MON_FOLLOW_DE  ,       "DE"    );
  462.                
  463.         temp_mf_flag = MF_STRING | ((conf.trace_follow_regs == REG_HL) ? MF_CHECKED : MF_UNCHECKED);   
  464.         AppendMenu( wnd_trace_follow_sub_menu, temp_mf_flag, IDM_MON_FOLLOW_HL  ,       "HL"    );
  465.        
  466.         AppendMenu( wnd_trace_follow_sub_menu, MF_SEPARATOR, 0, nullptr); //----------------------
  467.  
  468.         temp_mf_flag = MF_STRING | ((conf.trace_follow_regs == REG_AF1) ? MF_CHECKED : MF_UNCHECKED);  
  469.         AppendMenu( wnd_trace_follow_sub_menu, temp_mf_flag, IDM_MON_FOLLOW_AF1 ,       "AF\'"  );
  470.                
  471.         temp_mf_flag = MF_STRING | ((conf.trace_follow_regs == REG_BC1) ? MF_CHECKED : MF_UNCHECKED);  
  472.         AppendMenu( wnd_trace_follow_sub_menu, temp_mf_flag, IDM_MON_FOLLOW_BC1 ,       "BC\'"  );
  473.                
  474.         temp_mf_flag = MF_STRING | ((conf.trace_follow_regs == REG_DE1) ? MF_CHECKED : MF_UNCHECKED);  
  475.         AppendMenu( wnd_trace_follow_sub_menu, temp_mf_flag, IDM_MON_FOLLOW_DE1 ,       "DE\'"  );     
  476.                
  477.         temp_mf_flag = MF_STRING | ((conf.trace_follow_regs == REG_HL1) ? MF_CHECKED : MF_UNCHECKED);  
  478.         AppendMenu( wnd_trace_follow_sub_menu, temp_mf_flag, IDM_MON_FOLLOW_HL1 ,       "HL\'"  );
  479.  
  480.         AppendMenu( wnd_trace_follow_sub_menu, MF_SEPARATOR, 0, nullptr); //----------------------
  481.                
  482.         temp_mf_flag = MF_STRING | ((conf.trace_follow_regs == REG_IX) ? MF_CHECKED : MF_UNCHECKED);   
  483.         AppendMenu( wnd_trace_follow_sub_menu, temp_mf_flag, IDM_MON_FOLLOW_IX  ,       "IX"    );
  484.                
  485.         temp_mf_flag = MF_STRING | ((conf.trace_follow_regs == REG_IY) ? MF_CHECKED : MF_UNCHECKED);   
  486.         AppendMenu( wnd_trace_follow_sub_menu, temp_mf_flag, IDM_MON_FOLLOW_IY  ,       "IY"    );
  487.                
  488.         AppendMenu( wnd_trace_follow_sub_menu, MF_SEPARATOR, 0, nullptr); //----------------------
  489.        
  490.         temp_mf_flag = MF_STRING | ((conf.trace_follow_regs == REG_SP) ? MF_CHECKED : MF_UNCHECKED);   
  491.         AppendMenu( wnd_trace_follow_sub_menu, temp_mf_flag, IDM_MON_FOLLOW_SP  ,       "SP"    );
  492.                
  493.         temp_mf_flag = MF_STRING | ((conf.trace_follow_regs == REG_PC) ? MF_CHECKED : MF_UNCHECKED);   
  494.         AppendMenu( wnd_trace_follow_sub_menu, temp_mf_flag, IDM_MON_FOLLOW_PC  ,       "PC"    );
  495.        
  496.         AppendMenu( wnd_trace_follow_sub_menu, MF_SEPARATOR, 0, nullptr); //----------------------
  497.        
  498.         temp_mf_flag = MF_STRING | ((conf.trace_follow_regs == REG_NONE) ? MF_CHECKED : MF_UNCHECKED); 
  499.         AppendMenu( wnd_trace_follow_sub_menu, temp_mf_flag, IDM_MON_FOLLOW_NONE,       "Off"   );
  500.         //=====================================================================
  501.  
  502.  
  503.         //---------------------------------------------------------------------
  504.        
  505.  
  506.         //---------------------------------------------------------------------
  507.         // WNDMEM - Switch dump mode - sub menu
  508.         HMENU wnd_mem_switch_dump_mode_sub_menu = CreatePopupMenu();
  509.        
  510.         AppendMenu( wnd_mem_switch_dump_mode_sub_menu, MF_STRING, IDM_MON_MEM_DUMP_MEM  ,       "CPU Memory"    );
  511.         AppendMenu( wnd_mem_switch_dump_mode_sub_menu, MF_STRING, IDM_MON_MEM_DUMP_PHYS ,       "Disk PHYS"     );
  512.         AppendMenu( wnd_mem_switch_dump_mode_sub_menu, MF_STRING, IDM_MON_MEM_DUMP_LOG  ,       "Disk LOG"              );
  513.         AppendMenu( wnd_mem_switch_dump_mode_sub_menu, MF_STRING, IDM_MON_MEM_DUMP_CMOS ,       "CMOS"          );
  514.         AppendMenu( wnd_mem_switch_dump_mode_sub_menu, MF_STRING, IDM_MON_MEM_DUMP_NVRAM ,      "NVRAM"         );
  515.         AppendMenu( wnd_mem_switch_dump_mode_sub_menu, MF_STRING, IDM_MON_MEM_DUMP_COMP_PAL ,   "Comp_Pal"      );
  516.         //---------------------------------------------------------------------
  517.        
  518.  
  519.  
  520.         HMENU menu = CreatePopupMenu();
  521.  
  522.  
  523.  
  524. //      AppendMenu( menu, MF_STRING | MF_POPUP ,        (UINT) sub_menu, "444"                  );
  525.        
  526.        
  527.        
  528. //      WNDNO,          WNDMEM,         WNDTRACE,       WNDREGS,
  529. //      WND_PORTS,      WND_BETA128,    WND_STACK,      WND_PAGES,
  530. //      WND_WATCHES,    WND_AY,         WND_TIME_DELTA
  531.    
  532.         //=====================================================================
  533.         //  Right click at Trace window
  534.         //=====================================================================
  535.         if (activedbg == WNDTRACE)
  536.         {
  537.             Z80 &cpu = CpuMgr.Cpu();
  538.             //====================================================================================================
  539.             temp_mf_flag = (cpu.membits[ cpu.trace_curs] & MEMBITS_BPX)  ?  MF_STRING | MF_CHECKED:
  540.                                                                             MF_STRING;
  541.             AppendMenu( menu, temp_mf_flag, IDM_MON_BPX,                        "Breakpoint"                    );
  542.             //----------------------------------------------------------------------------------------------------
  543.             temp_mf_flag = (cpu.membits[ cpu.trace_curs] & MEMBITS_BPR)  ?  MF_STRING | MF_CHECKED:
  544.                                                                             MF_STRING;
  545.             AppendMenu( menu, temp_mf_flag, IDM_MON_BPR,                        "Breakpoint Read"               );
  546.             //----------------------------------------------------------------------------------------------------
  547.             temp_mf_flag = (cpu.membits[ cpu.trace_curs] & MEMBITS_BPW)  ?  MF_STRING | MF_CHECKED:
  548.                                                                             MF_STRING;
  549.             AppendMenu( menu, temp_mf_flag, IDM_MON_BPW,                        "Breakpoint Write"              );
  550.             AppendMenu( menu, MF_SEPARATOR, 0, nullptr); //=======================================================
  551.             AppendMenu( menu, MF_STRING, IDM_MON_GOTO_PC,                       "Goto PC"                       );
  552.             //----------------------------------------------------------------------------------------------------
  553.             AppendMenuA( menu, (MF_STRING | MF_POPUP),
  554.                                 (UINT_PTR) wnd_trace_goto_sub_menu,             "Goto Register"  ); // -->
  555.             //----------------------------------------------------------------------------------------------------
  556.             AppendMenu( menu, MF_STRING, IDM_MON_GOTO_OPERAND_ADDR,             "Goto Operand Address"          );
  557.  
  558.             AppendMenu( menu, MF_SEPARATOR, 0, nullptr); //=======================================================
  559.             AppendMenuA( menu, (MF_STRING | MF_POPUP),
  560.                                 (UINT_PTR) wnd_trace_view_sub_menu,             "View Register"  ); // -->
  561.             //----------------------------------------------------------------------------------------------------
  562.             AppendMenu( menu, MF_STRING, IDM_MON_VIEW_OPERAND_ADDR,             "View Operand Address"          );
  563.             AppendMenu( menu, MF_SEPARATOR, 0, nullptr); //=======================================================
  564.             AppendMenuA( menu, (MF_STRING | MF_POPUP),
  565.                                 (UINT_PTR) wnd_trace_follow_sub_menu,           "Follow Register" ); // -->
  566.             //----------------------------------------------------------------------------------------------------
  567.             AppendMenu( menu, MF_STRING, IDM_MON_RETURN_TO_PREV_ADDR,           "Return to Previous Address"    );
  568.             AppendMenu( menu, MF_SEPARATOR, 0, nullptr); //=======================================================
  569.             AppendMenu( menu, MF_STRING, IDM_MON_SET_PC_TO_CURSOR,              "Set PC to Cursor"              );
  570.             //----------------------------------------------------------------------------------------------------
  571.             AppendMenu( menu, MF_STRING, IDM_MON_TRACE_TO_CURSOR,               "Trace to Cursor"               );
  572.             AppendMenu( menu, MF_SEPARATOR, 0, nullptr); //=======================================================
  573.             AppendMenu( menu, MF_STRING, IDM_MON_TOGGLE_LABELS,                 "Toggle Labels"                 );
  574.             //----------------------------------------------------------------------------------------------------
  575.             AppendMenu( menu, MF_STRING, IDM_MON_IMPORT_LABELS_FROM_ALASM,      "Import Labels From XAS/ALASM"  );
  576.             AppendMenu( menu, MF_SEPARATOR, 0, nullptr); //=======================================================
  577.             AppendMenu( menu, MF_STRING, IDM_MON_FIND_CODE,                     "Find Code"                     );
  578.             //----------------------------------------------------------------------------------------------------
  579.             AppendMenu( menu, MF_STRING, IDM_MON_FIND_TEXT,                     "Find Text"                     );
  580.             AppendMenu( menu, MF_SEPARATOR, 0, nullptr); //=======================================================
  581.             AppendMenu( menu, MF_STRING, IDM_MON_SWITCH_CPU,                    "Switch CPU ZX/GS"              );
  582.             //====================================================================================================
  583.         }
  584.         //=====================================================================
  585.        
  586.        
  587.         //=====================================================================
  588.         //  Right click at Regs window
  589.         //=====================================================================
  590.         else if (activedbg == WNDREGS)
  591.         {
  592.             AppendMenu(menu, MF_STRING, IDM_MON_REG_GOTO_ADDR, "Goto address");
  593.             AppendMenu(menu, MF_STRING, IDM_MON_REG_VIEW_ADDR, "View address");
  594.             //AppendMenu(menu, MF_STRING, 0, "I don't know");   //юЁшушэры№эр  ьєЄ№...
  595.             //AppendMenu(menu, MF_STRING, 0, "what to place");
  596.             //AppendMenu(menu, MF_STRING, 0, "to menu, so");
  597.             //AppendMenu(menu, MF_STRING, 0, "No Stuff Here");
  598.         }
  599.         //=====================================================================
  600.        
  601.        
  602.        
  603.         //=====================================================================
  604.         //  Right click at Memory window
  605.         //=====================================================================
  606.         else if (activedbg == WNDMEM)
  607.         {
  608.             AppendMenu( menu, MF_STRING, IDM_MON_MEM_GOTO_PC,                   "Goto PC"               );
  609.             AppendMenu( menu, MF_STRING, IDM_MON_MEM_GOTO_SP,                   "Goto SP"               );
  610.             AppendMenu( menu, MF_SEPARATOR, 0, nullptr);        //----------------------------------------
  611.             AppendMenu( menu, MF_STRING, IDM_MON_MEM_BPX,                       "Breakpoint"            );
  612.             AppendMenu( menu, MF_STRING, IDM_MON_MEM_BPR,                       "Breakpoint Read"       );
  613.             AppendMenu( menu, MF_STRING, IDM_MON_MEM_BPW,                       "Breakpoint Write"      );
  614.             AppendMenu( menu, MF_SEPARATOR, 0, nullptr);        //----------------------------------------
  615.             AppendMenu( menu, MF_STRING, IDM_MON_MEM_TOGGLE_DUMP_HEX_TEXT,      "Toggle hex/text"       );
  616.             AppendMenuA( menu, (MF_STRING | MF_POPUP),
  617.                                 (UINT_PTR) wnd_mem_switch_dump_mode_sub_menu,   "Switch dump mode"      ); // -->
  618.             AppendMenu( menu, MF_SEPARATOR, 0, nullptr);        //----------------------------------------
  619.             AppendMenu( menu, MF_STRING, IDM_MON_MEM_FIND_CODE,                 "Find code"             );
  620.             AppendMenu( menu, MF_STRING, IDM_MON_MEM_FIND_TEXT,                 "Find text"             );         
  621.             AppendMenu( menu, MF_SEPARATOR, 0, nullptr);        //----------------------------------------
  622.             AppendMenu( menu, MF_STRING, IDM_MON_LOADBLOCK,                     "Load block"            );
  623.             AppendMenu( menu, MF_STRING, IDM_MON_SAVEBLOCK,                     "Save block"            );
  624.             AppendMenu( menu, MF_STRING, IDM_MON_FILLBLOCK,                     "Fill block"            );
  625.             AppendMenu( menu, MF_SEPARATOR, 0, nullptr);        //----------------------------------------
  626.             AppendMenu( menu, MF_STRING, IDM_MON_RIPPER,                        "Ripper's tool"         );
  627.             // AppendMenu( menu, MF_STRING, IDM_MON_MEM_GOTO_ADDRESS,           "Goto address"); //        deprecated      
  628.             // AppendMenu( menu, MF_STRING, IDM_MON_MEM_SWITCH_DUMP_MODE,       "Switch dump mode"      );
  629.         }
  630.         //=====================================================================
  631.        
  632.        
  633.         //=====================================================================
  634.         //  Right click at watches window
  635.         //=====================================================================
  636.         else if (activedbg == WND_WATCHES)
  637.         {
  638.             AppendMenu( menu, MF_STRING, IDM_MON_WATCHES_WATCHES,               "Watches"               );
  639.             AppendMenu( menu, MF_STRING, IDM_MON_WATCHES_SCREEN_MEMORY,         "Screen Memory"         );
  640.             AppendMenu( menu, MF_STRING, IDM_MON_WATCHES_SHADOW_SCREEN_MEMORY,  "Shadow Screen Memory"  );
  641.             AppendMenu( menu, MF_STRING, IDM_MON_WATCHES_RAY_PAINTED,           "Ray-Painted"           );
  642.             AppendMenu( menu, MF_SEPARATOR, 0, nullptr);        //----------------------------------------
  643.             AppendMenu( menu, MF_STRING, IDM_MON_WATCHES_SET_WATCH_ADDRESS,     "Set Watch Address"     );
  644.         }
  645.        
  646.         //---------------------------------------------------------------------
  647.         else
  648.         {
  649.             AppendMenu( menu, MF_STRING, 0, "HZ MENU");
  650.         }
  651. //-----------------------------------------------------------------------------
  652.  
  653.         //DrawMenuBar(wnd);
  654.  
  655.  
  656.  
  657.         int cmd = TrackPopupMenu(       menu,
  658.                                         TPM_RETURNCMD | TPM_NONOTIFY | TPM_LEFTALIGN | TPM_TOPALIGN,
  659.                                         int(mousepos & 0xFFFF) + temp.client.left,
  660.                                         int((mousepos >> 16) & 0x7FFF) + temp.client.top,
  661.                                         0,
  662.                                         wnd,
  663.                                         nullptr
  664.                                  );
  665.  
  666.         //---------------------------------------------------------------------
  667.         // чрўхь Єю єфры хь тёх ьхэ■°ъш
  668.         // эртхЁэюх яє°ю шї 16384 яю тёх юфэютЁхьхээю чряє∙хээ√х яЁюЎхёё√ ш ьюцхЄ эх їтрЄшЄ№...
  669.         DestroyMenu( menu);
  670.        
  671.         DestroyMenu( wnd_trace_view_sub_menu);
  672.         DestroyMenu( wnd_trace_goto_sub_menu);
  673.         DestroyMenu( wnd_trace_follow_sub_menu);       
  674.        
  675.         DestroyMenu( wnd_mem_switch_dump_mode_sub_menu);
  676.        
  677.        
  678.        
  679.        
  680. // хёыш эх яЁртшЄ№ mousepos ╥╬ яЁш т√ъшф√трэшш ьхэ■°ъш
  681. // эрцрЄшх up/down яЁштхфхЄ ъ т√їюфє яю if (mousepos) return 0; т handle_menu()
  682.        
  683.         mousepos = 0;           // ьюцхЄ эєцэю яЁ ь ё■фр?
  684.            
  685.         debug_mouse_keys = 0;   // яюър яюыэ√щ ёсЁюё эрцрЄ√ї ъыртш°№
  686.        
  687.         // ьюцэю фхырЄ№
  688.         //    debugscr();
  689.         //      debugflip();
  690.         // тьхёЄю needclr
  691.        
  692.        
  693.         // яхЁхяшёрЄ№ яюф switch !!!
  694.         //=====================================================================
  695.         // ╬сЁрсюЄър ёюс√Єшщ ъюэЄхъёэюую ьхэ■ фхсрухЁр
  696.         //---------------------------------------------------------------------
  697.        
  698.         //---------------------------------------------------------------------
  699.         // WNDTRACE     (т юъэх фшчрёьр)
  700.         //---------------------------------------------------------------------
  701.         if (cmd == IDM_MON_BPX)                 { cbpx();                               needclr++;      }
  702.         if (cmd == IDM_MON_BPR)                 { cbpr();                               needclr++;      }
  703.         if (cmd == IDM_MON_BPW)                 { cbpw();                               needclr++;      }      
  704.         // -----
  705.         if (cmd == IDM_MON_GOTO_PC)             { cfindpc();            showtrace();    debugflip();    }
  706.         // goto register -->
  707.                 if (cmd == IDM_MON_GOTO_AF)     { mon_goto_disasm_rAF();        needclr++; }
  708.                 if (cmd == IDM_MON_GOTO_BC)     { mon_goto_disasm_rBC();        needclr++; }
  709.                 if (cmd == IDM_MON_GOTO_DE)     { mon_goto_disasm_rDE();        needclr++; }
  710.                 if (cmd == IDM_MON_GOTO_HL)     { mon_goto_disasm_rHL();        needclr++; }
  711.                 // -----
  712.                 if (cmd == IDM_MON_GOTO_AF1)    { mon_goto_disasm_rAF1();       needclr++; }
  713.                 if (cmd == IDM_MON_GOTO_BC1)    { mon_goto_disasm_rBC1();       needclr++; }
  714.                 if (cmd == IDM_MON_GOTO_DE1)    { mon_goto_disasm_rDE1();       needclr++; }
  715.                 if (cmd == IDM_MON_GOTO_HL1)    { mon_goto_disasm_rHL1();       needclr++; }
  716.                 // -----
  717.                 if (cmd == IDM_MON_GOTO_IX)     { mon_goto_disasm_rIX();        needclr++; }
  718.                 if (cmd == IDM_MON_GOTO_IY)     { mon_goto_disasm_rIY();        needclr++; }
  719.                 if (cmd == IDM_MON_GOTO_SP)     { mon_goto_disasm_rSP();        needclr++; }
  720.                 if (cmd == IDM_MON_GOTO_PC)     { mon_goto_disasm_rPC();        needclr++; }
  721.         if (cmd == IDM_MON_GOTO_OPERAND_ADDR)   { cjump();              showtrace();    debugflip();    }
  722.         // -----       
  723.         // view register -->
  724.                 if (cmd == IDM_MON_VIEW_AF)     { mon_view_mem_rAF();   needclr++; }
  725.                 if (cmd == IDM_MON_VIEW_BC)     { mon_view_mem_rBC();   needclr++; }
  726.                 if (cmd == IDM_MON_VIEW_DE)     { mon_view_mem_rDE();   needclr++; }
  727.                 if (cmd == IDM_MON_VIEW_HL)     { mon_view_mem_rHL();   needclr++; }
  728.                 // -----
  729.                 if (cmd == IDM_MON_VIEW_AF1)    { mon_view_mem_rAF1();  needclr++; }
  730.                 if (cmd == IDM_MON_VIEW_BC1)    { mon_view_mem_rBC1();  needclr++; }
  731.                 if (cmd == IDM_MON_VIEW_DE1)    { mon_view_mem_rDE1();  needclr++; }
  732.                 if (cmd == IDM_MON_VIEW_HL1)    { mon_view_mem_rHL1();  needclr++; }
  733.                 // -----
  734.                 if (cmd == IDM_MON_VIEW_IX)     { mon_view_mem_rIX();   needclr++; }
  735.                 if (cmd == IDM_MON_VIEW_IY)     { mon_view_mem_rIY();   needclr++; }
  736.                 if (cmd == IDM_MON_VIEW_SP)     { mon_view_mem_rSP();   needclr++; }
  737.                 if (cmd == IDM_MON_VIEW_PC)     { mon_view_mem_rPC();   needclr++; }
  738.                
  739.         if (cmd == IDM_MON_VIEW_OPERAND_ADDR)   { cdjump();                             needclr++;      }
  740.         // -----
  741.         // follow register -->
  742.                 if (cmd == IDM_MON_FOLLOW_AF)   { conf.trace_follow_regs = REG_AF;      needclr++; }
  743.                 if (cmd == IDM_MON_FOLLOW_BC)   { conf.trace_follow_regs = REG_BC;      needclr++; }
  744.                 if (cmd == IDM_MON_FOLLOW_DE)   { conf.trace_follow_regs = REG_DE;      needclr++; }
  745.                 if (cmd == IDM_MON_FOLLOW_HL)   { conf.trace_follow_regs = REG_HL;      needclr++; }
  746.                 // -----
  747.                 if (cmd == IDM_MON_FOLLOW_AF1)  { conf.trace_follow_regs = REG_AF1;     needclr++; }
  748.                 if (cmd == IDM_MON_FOLLOW_BC1)  { conf.trace_follow_regs = REG_BC1;     needclr++; }
  749.                 if (cmd == IDM_MON_FOLLOW_DE1)  { conf.trace_follow_regs = REG_DE1;     needclr++; }
  750.                 if (cmd == IDM_MON_FOLLOW_HL1)  { conf.trace_follow_regs = REG_HL1;     needclr++; }
  751.                 // -----
  752.                 if (cmd == IDM_MON_FOLLOW_IX)   { conf.trace_follow_regs = REG_IX;      needclr++; }
  753.                 if (cmd == IDM_MON_FOLLOW_IY)   { conf.trace_follow_regs = REG_IY;      needclr++; }
  754.                 if (cmd == IDM_MON_FOLLOW_SP)   { conf.trace_follow_regs = REG_SP;      needclr++; }
  755.                 if (cmd == IDM_MON_FOLLOW_PC)   { conf.trace_follow_regs = REG_PC;      needclr++; }
  756.                 // -----
  757.                 if (cmd == IDM_MON_FOLLOW_NONE) { conf.trace_follow_regs = REG_NONE;    needclr++; }           
  758.         if (cmd == IDM_MON_RETURN_TO_PREV_ADDR) { pop_pos() ;           showtrace();    debugflip();    }
  759.         // -----
  760.         if (cmd == IDM_MON_SET_PC_TO_CURSOR)    { csetpc();             showtrace();    debugflip();    }
  761.         if (cmd == IDM_MON_TRACE_TO_CURSOR)     { chere();              dbg_force_exit = 1;             }
  762.         // chere() ЁрсюЄрхЄ Єюы№ъю яюёых яшэър !
  763.         // -----
  764.         if (cmd == IDM_MON_TOGGLE_LABELS)       { cfliplabels();        /*showtrace()*/ debugflip();    }
  765.         if (cmd == IDM_MON_IMPORT_LABELS_FROM_ALASM) { c_lbl_import();                  needclr++;      }
  766.         // -----
  767.         if (cmd == IDM_MON_FIND_CODE)           { cfindcode() ;                         needclr++;      }
  768.         if (cmd == IDM_MON_FIND_TEXT)           { cfindtext() ;                         needclr++;      }
  769.         // -----
  770.         if (cmd == IDM_MON_SWITCH_CPU)            mon_switch_cpu();
  771.         //---------------------------------------------------------------------
  772.        
  773.        
  774.         //=====================================================================
  775.         // WNDMEM       (т юъэх ьхьюЁш тшхтхЁр)
  776.         //=====================================================================
  777.         if (cmd == IDM_MON_MEM_GOTO_PC)                 { mpc();        showmem();      debugflip();    }
  778.         if (cmd == IDM_MON_MEM_GOTO_SP)                 { msp();        showmem();      debugflip();    }
  779.         //---------------------------------------------------------------------
  780.         if (cmd == IDM_MON_MEM_BPX)                     { mbpx();                       needclr++;      }
  781.         if (cmd == IDM_MON_MEM_BPR)                     { mbpr();                       needclr++;      }
  782.         if (cmd == IDM_MON_MEM_BPW)                     { mbpw();                       needclr++;      }
  783.         //---------------------------------------------------------------------
  784.         if (cmd == IDM_MON_MEM_TOGGLE_DUMP_HEX_TEXT)    { mon_dump();                   needclr++;      }
  785.         // Switch dump mode - Sub Menu
  786.                 if (cmd == IDM_MON_MEM_DUMP_MEM)        { editor = 0;                   needclr++;};
  787.                 if (cmd == IDM_MON_MEM_DUMP_PHYS)       { editor = 1;                   needclr++;};
  788.                 if (cmd == IDM_MON_MEM_DUMP_LOG)        { editor = 2;                   needclr++;};
  789.                 if (cmd == IDM_MON_MEM_DUMP_CMOS)       { editor = 3;                   needclr++;};
  790.                 if (cmd == IDM_MON_MEM_DUMP_NVRAM)      { editor = 4;                   needclr++;};
  791.                 if (cmd == IDM_MON_MEM_DUMP_COMP_PAL)   { editor = 5;                   needclr++;};
  792.         //---------------------------------------------------------------------
  793.         if (cmd == IDM_MON_MEM_FIND_CODE)               { mcode();                      needclr++;      }
  794.         if (cmd == IDM_MON_MEM_FIND_TEXT)               { mtext();                      needclr++;      }
  795.         // -----       
  796.         if (cmd == IDM_MON_LOADBLOCK)                   { mon_load();                   needclr++;      }
  797.         if (cmd == IDM_MON_SAVEBLOCK)                   { mon_save();                   needclr++;      }
  798.         if (cmd == IDM_MON_FILLBLOCK)                   { mon_fill();                   needclr++;      }
  799.         // -----
  800.         if (cmd == IDM_MON_RIPPER)                      { mon_tool();                   needclr++;      }
  801.         //---------------------------------------------------------------------
  802. //      if (cmd == IDM_MON_MEM_GOTO_ADDRESS)            { mgoto();      showmem();      debugflip();    }
  803. //      if (cmd == IDM_MON_MEM_SWITCH_DUMP_MODE)        { mon_switch_dump();            needclr++;      }      
  804.         //=====================================================================
  805.        
  806.        
  807.         //=====================================================================
  808.         // WNDREGS      (т юъэх ЁхушёЄЁют)      
  809.         //=====================================================================
  810.         if (cmd == IDM_MON_REG_GOTO_ADDR)               { rcodejump();                  needclr++;      }
  811.         if (cmd == IDM_MON_REG_VIEW_ADDR)               { rdatajump();                  needclr++;      }
  812.         //=====================================================================
  813.        
  814.        
  815.        
  816.         //---------------------------------------------------------------------
  817.         // WND_WATCHES  (т юъэх трўхёют)        
  818.         //---------------------------------------------------------------------
  819.         if (cmd == IDM_MON_WATCHES_WATCHES)             { show_scrshot = 0;     needclr++;      }
  820.         if (cmd == IDM_MON_WATCHES_SCREEN_MEMORY)       { show_scrshot = 1;     needclr++;      }
  821.         if (cmd == IDM_MON_WATCHES_SHADOW_SCREEN_MEMORY){ show_scrshot = 2;     needclr++;      }
  822.         if (cmd == IDM_MON_WATCHES_RAY_PAINTED)         { show_scrshot = 3;     needclr++;      }
  823.         if (cmd == IDM_MON_WATCHES_SET_WATCH_ADDRESS)   { mon_setwatch();       needclr++;      }
  824.         //---------------------------------------------------------------------
  825.  
  826.  
  827.  
  828.         //if (cmd == IDM_SOME_OTHER) some_other();
  829.         //needclr++;
  830.     }
  831.     // Right click
  832.     //=========================================================================
  833.    
  834.     mousepos = 0;       // [NS] яхЁхэхёхэю ттхЁї
  835.                         // хёыш чръюьхэЄшЄ№ ЄєЄ Єю ъєЁёюЁ/т√фхыхэшх юяъюфр т фхсрухЁх чрёЄЁ хЄ т ьхёЄх ъышър
  836.  
  837.  
  838.     // printf("debug_mouse_keys %8X\n",debug_mouse_keys);
  839.    
  840.     //=========================================================================
  841.     // Double Left Click
  842.     if (debug_mouse_keys & DEBUG_MOUSE_LEFT_DBL)
  843.     {
  844.         //---------------------------------------------------------------------
  845.         // Double Left т юъэх фшчрёьр -> Ёхцшь ЁхфръЄшЁютрэш 
  846.         if (activedbg == WNDTRACE)
  847.         {
  848.             // ъюёЄ√ы№                  // шэрўх сєфхЄ Ёхцшь ЁхфръЄшЁюрэш  ттюфюь
  849.             input.lastkey = VK_RETURN;  // ё юўшёЄъющ ёюфхЁцшьюую
  850.                                         // ъюуфр эрь эрфю схч юўшёЄъш
  851.             center();
  852.            
  853.             // ъюёЄ√ы№   // схч яхЁхЁшёютъш !!!!
  854.             showtrace(); // сєфхЄ фтющэюх ёюїЁрэхэшх ё чрЄшЁрэшхь ёыхфє■∙шї ъюьрэф!!
  855.             debugflip(); // тшфшью тїюф т ЁхфръЄшЁютрэш  ёыхф ъюьрэф√ эх тшфэю
  856.                          // р фрээ√х схЁєЄёю шч ёЄрЁюую сєЇхЁр
  857.         }
  858.         //---------------------------------------------------------------------
  859.         // Double Left т юъэх ьхьюЁш тшхтхЁр -> Ёхцшь ЁхфръЄшЁютрэш 
  860.         if (activedbg == WNDMEM)
  861.         {
  862.             menter();   // ёрь ЁрсюЄрхЄ Єюы№ъю ъюуфр ъєЁёюЁ эрф рфЁхёюь
  863.                         // фЁєушх яЁютхЁъш эх эєцэ√
  864.             showmem();          // эєцэр яхЁхЁшёютър
  865.             debugflip();        // шэрўх яхЁхїюф тшфэю Єюы№ъю яюЄюь
  866.         }
  867.         //---------------------------------------------------------------------
  868.         // Double Left т юъэх ьхьюЁш тшхтхЁр -> Ёхцшь ЁхфръЄшЁютрэш 
  869.         if (activedbg == WNDREGS)
  870.         {
  871.             // ъюёЄ√ы№                  // шэрўх ёЁрсрЄ√трхЄ т√їюф т renter()
  872.             input.lastkey = VK_RETURN;  // т if ( ToAscii(
  873.            
  874.             renter();   // ёрь ЁрсюЄрхЄ Єюы№ъю ъюуфр ъєЁёюЁ эрф рфЁхёюь
  875.                         // фЁєушх яЁютхЁъш эх эєцэ√
  876.             showregs();         // эєцэр яхЁхЁшёютър
  877.             debugflip();        // шэрўх шчьхэхэш  тшфэю Єюы№ъю яюЄюь
  878.         }
  879.         //---------------------------------------------------------------------
  880.     }
  881.     //-------------------------------------------------------------------------
  882.     debug_mouse_keys = 0;       // эр тё ъшщ ёыєўрщ
  883.     //=========================================================================
  884.    
  885. }
  886. //=============================================================================
  887.  
  888.  
  889. //=============================================================================
  890. void TCpuMgr::CopyToPrev()
  891. {
  892.     for(unsigned i = 0; i < Count; i++)
  893.         PrevCpus[i] = *Cpus[i];
  894. }
  895. //=============================================================================
  896.  
  897. /* ------------------------------------------------------------- */
  898.  
  899.  
  900.  
  901. //=============================================================================
  902. static void debug( Z80 *cpu)
  903. {
  904. //тїюф ё■фр Єюы№ъю яЁш тїюфх т фхсрухЁ
  905. // ш яЁш step over ъюуфр яЁюяєёър■Єёю call-√
  906. //  printf("debug entry");
  907.  
  908.     //-------------------------------------------------------------------------
  909.     if (conf.debug_unlock_mouse)        // [NS]
  910.     {
  911.         main_unlock_mouse_silent();
  912.     }
  913.     //-------------------------------------------------------------------------
  914.     dbg_force_exit = 0;                 // [NS]
  915.        
  916.     conf.trace_follow_request = 1;      // яхЁхтхёЄш Їюъєё эр PC яЁш тїюфх      [NS]
  917.    
  918.     cpu->graph_trace_cursor_pos = 0;    // ўшёЄю уЁрЇшўхёъюх яюыюцхэшх ъєЁёюЁр  [NS]
  919.  
  920.     OnEnterGui();
  921.  
  922.     update_disasm_style();              // [NS]
  923.    
  924.     temp.mon_scale = temp.scale;       
  925.     temp.scale = 1;            
  926.    
  927.    //#define RF_MONITOR (RF_MON | RF_GDI | RF_2X)
  928. //   temp.rflags = RF_MONITOR;
  929.  
  930.  
  931. //   RECT current_mainwnd_size;
  932. //   GetClientRect( wnd, &current_mainwnd_size);
  933. //   int real_dbg_wnd_size_x = current_mainwnd_size.right - current_mainwnd_size.left;
  934. //   int real_dbg_wnd_size_y = current_mainwnd_size.bottom - current_mainwnd_size.top;
  935.  
  936.  
  937.  
  938.  
  939.     if          (temp.rflags & RF_4X)                   //NS
  940.     {
  941.         temp.rflags = (RF_MON | RF_GDI | RF_4X);
  942.     }
  943.     else if     (temp.rflags & RF_3X)
  944.     {
  945.         temp.rflags = (RF_MON | RF_GDI | RF_3X);
  946.     }
  947.     else if     (temp.rflags & RF_2X)
  948.     {
  949.         temp.rflags = (RF_MON | RF_GDI | RF_2X);
  950.     }
  951.     else if     (temp.rflags & RF_1X)
  952.     {
  953.         temp.rflags = (RF_MON | RF_GDI | RF_1X);
  954.     }
  955.  
  956.    
  957.     needclr = 1;
  958.     dbgbreak = 1;
  959.  
  960.     //conf.win_resize_request = 0;
  961.     set_video( TRUE);   //эрфю тъы■ўрЄ№ gdi Ёхцшь!!
  962.                         // preserve_size = true
  963.                        
  964.     CpuMgr.SetCurrentCpu( cpu->GetIdx());
  965.     TZ80State *prevcpu = &CpuMgr.PrevCpu( cpu->GetIdx());
  966.    
  967.     // ╧ю ьюхьє ¤Єю ъєфр яхЁхтюфшЄ№ ъєЁёюЁ яЁш тїюфх т фхсрухЁ
  968.     //cpu->trace_curs = cpu->pc;
  969.     if (conf.trace_follow_regs == REG_AF) cpu->trace_curs = cpu->af;
  970.     if (conf.trace_follow_regs == REG_BC) cpu->trace_curs = cpu->bc;
  971.     if (conf.trace_follow_regs == REG_DE) cpu->trace_curs = cpu->de;
  972.     if (conf.trace_follow_regs == REG_HL) cpu->trace_curs = cpu->hl;
  973.    
  974.     if (conf.trace_follow_regs == REG_AF1) cpu->trace_curs = cpu->alt.af;
  975.     if (conf.trace_follow_regs == REG_BC1) cpu->trace_curs = cpu->alt.bc;
  976.     if (conf.trace_follow_regs == REG_DE1) cpu->trace_curs = cpu->alt.de;
  977.     if (conf.trace_follow_regs == REG_HL1) cpu->trace_curs = cpu->alt.hl;
  978.    
  979.     if (conf.trace_follow_regs == REG_IX) cpu->trace_curs = cpu->ix;
  980.     if (conf.trace_follow_regs == REG_IY) cpu->trace_curs = cpu->iy;
  981.     if (conf.trace_follow_regs == REG_SP) cpu->trace_curs = cpu->sp;
  982.     if (conf.trace_follow_regs == REG_PC) cpu->trace_curs = cpu->pc;
  983.            
  984.     cpu->dbg_stopsp = cpu->dbg_stophere = -1U;
  985.     cpu->dbg_loop_r1 = 0;
  986.     cpu->dbg_loop_r2 = 0xFFFF;
  987.     mousepos = 0;
  988.  
  989.     //-------------------------------------------------------------------------
  990.     // dbg_mainloop
  991.     while (dbgbreak)    // debugger event loop
  992.     {                   // ┬╒╬─/╓╚╩╦ ╥╬╦▄╩╬ ╧╨╚ ╥█╩└═╚╚ ╩═╬╧╬╩ ╩╦└┬█!!!!
  993.                         // фы  ь√°√ ш ьхэ■°юъ хёЄ№ х∙х Ўшъы
  994. dbg_mainloop:
  995.    //printf("while(dbgbreak)\n");
  996.    
  997.         if (trace_labels)
  998.             mon_labels.notify_user_labels();
  999.  
  1000.         cpu = &CpuMgr.Cpu();
  1001.         prevcpu = &CpuMgr.PrevCpu( cpu->GetIdx());
  1002.        
  1003. repaint_dbg:
  1004. //printf("repaint_dbg\n !!!!!!!!!!!!");
  1005.         //тїюф яЁш      Є урэшш юъэю
  1006.         //              эрцрЄшш ъэюяюъ ь√°ш ш ъырт√
  1007.  
  1008.         cpu->trace_top &= 0xFFFF;
  1009.         cpu->trace_curs &= 0xFFFF;
  1010.  
  1011.         debugscr();     //юсэютыхэшх тёхї юъюэ т сєЇхЁх
  1012.         debugflip();    //юЄЁшёютър ¤ъЁрэр шч сєЇхЁр
  1013.  
  1014.  
  1015.  
  1016.  
  1017. //-----------------------------------------------------------------------------
  1018. sleep:
  1019. //printf("*");
  1020.         while (!dispatch(nullptr))
  1021.         {
  1022.             //Ўшъы юцшфрэш 
  1023.             //printf ("sleep\n");
  1024.            
  1025.             //printf("needclr %d\n",needclr);
  1026.      
  1027.             if (mousepos)
  1028.                 handle_mouse();
  1029.              
  1030.             if (needclr)        //unsigned char needclr
  1031.             {
  1032.                 //needclr--;
  1033.                 needclr = 0;    // ЄхёЄ [NS]
  1034.                                 // шсю эрїє  яхЁхЁшёют√трЄ№ 15 Ёрч?
  1035.                 goto repaint_dbg;
  1036.             }
  1037.          
  1038.             if (dbg_force_exit)
  1039.             {
  1040.                 dbg_force_exit = 0;
  1041.                 goto force_exit_from_debug;
  1042.             }
  1043.          
  1044.             Sleep(20);  //20 !!
  1045.         } //sleep loop
  1046. //-----------------------------------------------------------------------------
  1047. // ╬яЁюё ъырт√
  1048. //-----------------------------------------------------------------------------
  1049.        
  1050. // фхырЄ№ dispatch_more яюёых яЁютхЁъш ръЄшэюёЄш юъэр!!!
  1051. // ьюцхЄ ¤Єю яюьюцюЄ яюсхфшЄ№ ъюэЇышъЄ√ їюЄъххт
  1052. //      їюЄ  ъюэЇышъЄ яютЄюЁшЄ№ ┘└╤ эх єфрхЄёю
  1053. //      р ёрь уыюсры№э√щ эрсюЁ їюЄъххт ac_mon
  1054. //      яюфъы■ўхэ тэшч ъ ърцфюьє эрсюЁє їюЄъххт ac_regs, ac_trace, ac_mem
  1055. //              єцх юЄфхы№эю
  1056.  
  1057.        
  1058.         //---------------------------------------------------------------------
  1059.         // hotkeyz (ё сюы№°шь яЁшюЁшЄхЄюь)
  1060.         //---------------------------------------------------------------------
  1061.         if (activedbg == WNDREGS && dispatch_more(ac_regs))     // ъэюяъш т юъэх ЁхушёЄЁют
  1062.         {
  1063.             //printf("(activedbg == WNDREGS && dispatch_more(ac_regs))\n");
  1064.             continue;   //goto -> while (dbgbreak)
  1065.         }
  1066.         //---------------------------------------------------------------------
  1067.         if (activedbg == WNDTRACE && dispatch_more(ac_trace))   // ъэюяъш т юъэх фшчрёьр
  1068.         {
  1069.             //printf("(activedbg == WNDTRACE && dispatch_more(ac_trace))\n");
  1070.             continue;   //goto -> while (dbgbreak)
  1071.         }
  1072.         //---------------------------------------------------------------------
  1073.         if (activedbg == WNDMEM && dispatch_more(ac_mem))       // ъэюяъш т юъэх ьхьюЁш тшхтхЁр
  1074.         {
  1075.             //printf("(activedbg == WNDMEM && dispatch_more(ac_mem))\n");
  1076.             continue;   //goto -> while (dbgbreak)
  1077.         }
  1078.         //---------------------------------------------------------------------
  1079.         if (dispatch_more(ac_mon))                              // уыюсры№э√х ъэюяъш т фхсрухЁх
  1080.         {
  1081.             continue;   //goto -> while (dbgbreak)
  1082.         }
  1083.        
  1084.        
  1085.         //---------------------------------------------------------------------
  1086.         // ═рўрыю яЁ ьющ яЁртъш чэрўхэшщ (ё ьхэ№°шь яЁшюЁшЄхЄюь)
  1087.         //---------------------------------------------------------------------
  1088.         if (activedbg == WNDREGS && dispatch_regs())    // яЁртър т юъэх ЁхушёЄЁЁют
  1089.         {
  1090.             //printf("(activedbg == WNDREGS && dispatch_regs())\n");
  1091.             continue;   //goto -> while (dbgbreak)
  1092.         }
  1093.         //---------------------------------------------------------------------
  1094.         if (activedbg == WNDTRACE && dispatch_trace()) // яЁртър т юъэх фшчрёьр
  1095.         {
  1096.             //printf("(activedbg == WNDTRACE && dispatch_trace())\n");
  1097.             continue;   //goto -> while (dbgbreak)
  1098.         }
  1099.         //---------------------------------------------------------------------
  1100.         if (activedbg == WNDMEM && dispatch_mem()) // яЁртър т юъэх ьхьюЁш тшхтхЁр
  1101.         {
  1102.             //printf("(activedbg == WNDMEM && dispatch_mem())\n");
  1103.             continue;   //goto -> while (dbgbreak)
  1104.         }
  1105.         //---------------------------------------------------------------------
  1106.  
  1107.        
  1108.        
  1109. //      if (needclr)    //????? [NS] эрїЁхэр ¤Єю?
  1110. //      {
  1111. //          needclr--;
  1112. //          continue;
  1113. //      }
  1114.      
  1115.         goto sleep;
  1116.         //printf("exit 1\n");
  1117.    
  1118.     } //while (dbgbreak)
  1119.     //-------------------------------------------------------------------------
  1120.  
  1121. force_exit_from_debug:
  1122. // ┬√їюф шч фхсрухЁр  
  1123.     //printf("exit from debug\n");
  1124.  
  1125.     *prevcpu = *cpu;
  1126. //   CpuMgr.CopyToPrev();
  1127.     cpu->SetLastT();
  1128.     temp.scale = temp.mon_scale;       
  1129.    
  1130.     // ёшы№эю Є цхы√щ т√їюф шч фхсрухЁр
  1131.     // яхЁхёўхЄ√ ЄрсышЎ шЄф...
  1132.     apply_video( TRUE);         // preserve_size = true
  1133.     OnExitGui( false);
  1134. }
  1135. //=============================================================================
  1136.  
  1137.  
  1138. //=============================================================================
  1139. void debug_events( Z80 *cpu)
  1140. {
  1141.     unsigned pc = cpu->pc & 0xFFFF;
  1142.     unsigned char *membit =         cpu->membits         + pc;
  1143.     unsigned char *bp_disable_bit = cpu->bp_disable_bits + pc;  // [NS]
  1144.    
  1145.     *membit |= MEMBITS_X;       // memoryband
  1146.    
  1147.     // эєцэю чрьхэшЄ№ эр
  1148.     // dbgbreak |= ((*membit & MEMBITS_BPR) && (*bp_disable_bit & BP_DISABLE_BPR));
  1149.     // ш шэтхЁёшЁютрЄ№ эрчэрўхэшх сшЄют т BP_DISABLE_XXX !!!!!
  1150.     //-------------------------------------------------------------------------
  1151.     if ((*bp_disable_bit & BP_DISABLE_BPX) == 0)        // эх юяЄшьры№эю !!!!! [NS]
  1152.     {
  1153.         cpu->dbgbreak |= (*membit & MEMBITS_BPX);
  1154.         dbgbreak      |= (*membit & MEMBITS_BPX);
  1155.     }
  1156.     //-------------------------------------------------------------------------
  1157.     if (pc == cpu->dbg_stophere)
  1158.     {
  1159.         //printf("dbg_stophere\n");
  1160.         cpu->dbgbreak = 1;
  1161.         dbgbreak = 1;
  1162.     }
  1163.     //-------------------------------------------------------------------------
  1164.     if ((cpu->sp & 0xFFFF) == cpu->dbg_stopsp)
  1165.     {
  1166.         //---------------------------------------------------------------------
  1167.         if (pc > cpu->dbg_stophere && pc < cpu->dbg_stophere + 0x100)
  1168.         {
  1169.             //printf("dbg_stophere\n");
  1170.             cpu->dbgbreak = 1;
  1171.             dbgbreak = 1;
  1172.         }
  1173.         //---------------------------------------------------------------------
  1174.         if (pc < cpu->dbg_loop_r1 || pc > cpu->dbg_loop_r2)
  1175.         {
  1176.             cpu->dbgbreak = 1;
  1177.             dbgbreak = 1;
  1178.         }
  1179.         //---------------------------------------------------------------------
  1180.     }
  1181.     //-------------------------------------------------------------------------
  1182.     if (cpu->cbpn)
  1183.     {
  1184.         cpu->r_low = (cpu->r_low & 0x7F) + cpu->r_hi;
  1185.         //---------------------------------------------------------------------
  1186.         for (unsigned i = 0; i < cpu->cbpn; i++)
  1187.         {
  1188.             //-----------------------------------------------------------------
  1189.             if (calc( cpu, cpu->cbp[ i]))
  1190.             {
  1191.                 cpu->dbgbreak = 1;
  1192.                 dbgbreak = 1;
  1193.             }
  1194.             //-----------------------------------------------------------------
  1195.         }
  1196.         //---------------------------------------------------------------------
  1197.     }
  1198.     //-------------------------------------------------------------------------
  1199.  
  1200.     brk_port_in = brk_port_out = -1U; // reset only when breakpoints active
  1201.     //-------------------------------------------------------------------------
  1202.     if (cpu->dbgbreak)
  1203.         debug( cpu);
  1204.     //-------------------------------------------------------------------------
  1205. }
  1206. //=============================================================================
  1207.  
  1208.  
  1209. #endif // MOD_MONITOR
  1210.  
  1211.  
  1212. //=============================================================================
  1213. // is there breakpoints active or any other reason to use debug z80 loop?
  1214. unsigned char isbrk( const Z80 &cpu)    //!!!!!!!!
  1215. {
  1216.  
  1217. // трцэр  ЇєэъЎш  яЁш ьюфхЁэшчрЎшш фхсрухЁр !!!
  1218. // printf("isbrk()");
  1219.  
  1220.     //-------------------------------------------------------------------------
  1221.     #ifndef MOD_DEBUGCORE
  1222.         return 0;
  1223.     #else
  1224.     //-------------------------------------------------------------------------
  1225.         #ifdef MOD_MEMBAND_LED
  1226.             //-----------------------------------------------------------------
  1227.             if (conf.led.memband & 0x80000000)
  1228.                 return 1;
  1229.             //-----------------------------------------------------------------
  1230.             if (conf.led.memband_256 & 0x80000000)      // [NS]
  1231.                 return 1;
  1232.             //-----------------------------------------------------------------
  1233.         #endif
  1234.         //---------------------------------------------------------------------
  1235.         // breakpoint on read ROM switches ROM bank
  1236.         if (conf.mem_model == MM_PROFSCORP)             // ш чрўхь????
  1237.             return 1;
  1238.         //---------------------------------------------------------------------
  1239.         #ifdef MOD_MONITOR
  1240.             //-----------------------------------------------------------------
  1241.             if (cpu.cbpn)
  1242.                 return 1;
  1243.             //-----------------------------------------------------------------
  1244. // яЁютхЁър ёЄю Є ыш сЁ ъш!!!
  1245. // хёыш ЄєЄ сєфхЄ 4 ьхЄЁр яюф Ёрчфхы№э√х ёЄЁрэшЎ√
  1246. // эрфю сєфхЄ сыфцф яЁюўхё√трЄ№ 4+ ьхЄЁр !!!!!
  1247. // їюЄ  ¤Єю тшфшью эх Єръ ўрёЄю т√ч√трхЄёю
  1248.    
  1249. // яю їюЁю°хьє эєцэю эх ёърэшЁютрЄ№ яю 16╠ хёыш сЁ ъш эшъюуфр эх ёЄртшышё№
  1250. // шыш хёыш шї сюы№°х эхЄ...
  1251. //
  1252. // ...їюЄ  ЄхяхЁ№ цх сЁ ъш ш шч Їрщыр...
  1253. // р Єръ эрфхцэхщ :)
  1254.  
  1255.             unsigned char res = 0;
  1256.             //-----------------------------------------------------------------
  1257.             for (int i = 0;    i < 0x10000;    i++)
  1258.                 res |= cpu.membits[ i];
  1259.             //-----------------------------------------------------------------
  1260.             return (res & (MEMBITS_BPR | MEMBITS_BPW | MEMBITS_BPX));
  1261.         #endif //MOD_MONITOR
  1262.         //---------------------------------------------------------------------
  1263.     #endif
  1264.     //-------------------------------------------------------------------------
  1265. }
  1266. //=============================================================================
  1267.  
  1268.