Subversion Repositories pentevo

Rev

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

  1. #include "std.h"
  2.  
  3. #include "resource.h"
  4. #include "emul.h"
  5. #include "vars.h"
  6. #include "debug.h"
  7. #include "dbgpaint.h"
  8. #include "dbgoth.h"
  9. #include "gui.h"
  10. #include "fdd.h"
  11. #include "util.h"
  12.  
  13. //=============================================================================
  14. namespace z80dbg
  15. {
  16. __int64 __cdecl delta();
  17. __int64 __cdecl delta()
  18. {
  19.     return comp.t_states + cpu.t - cpu.debug_last_t;
  20. }
  21. }
  22. //=============================================================================
  23.  
  24.  
  25. #define DBG_ATTR_BCKGRND                0x00    //0     0
  26. #define DBG_ATTR_BCKGRND_ACTIVE         0x10    //blue  0
  27.  
  28.  
  29.  
  30. #define DBG_ATTR_PORTS_48_LOCK          0x0A    //b     RED
  31.  
  32.  
  33. #define DBG_ATTR_PAGES_ROM              0X07    //0    
  34. #define DBG_ATTR_PAGES_RAM              0X0F    //0     WHITE
  35. #define DBG_ATTR_PAGES_NMB              0x0C    //0     GREEN
  36.  
  37. #define DBG_ATTR_BETA128_VALUES         0X0F    //0     WHITE
  38. #define DBG_ATTR_BETA128_NAMES          0x0C    //0     GREEN
  39. #define DBG_ATTR_BETA128_OFF            0x09    //0     GREEN
  40.  
  41. #define DBG_ATTR_PORTS_VALUES           0X0F    //0     WHITE
  42. #define DBG_ATTR_PORTS_NAMES            0x0C    //0     GREEN
  43.  
  44. #define DBG_ATTR_WATCH_VALUES           0X09//F //0    
  45. #define DBG_ATTR_WATCH_NAMES            0x0C    //0    
  46.  
  47. #define DBG_ATTR_STACK_VALUES           0x0F    //0    
  48. #define DBG_ATTR_STACK_NAMES            0x0C    //0
  49. #define DBG_ATTR_STACK_NAME_SP          0x0E    //0    
  50.  
  51. #define DBG_ATTR_AY_VALUES_IO           0x0D    //0     //выбранный/активный регистр
  52. #define DBG_ATTR_AY_VALUES              0x0F    //0
  53.        
  54. #define DBG_ATTR_AY_NAMES               0x0C    //0
  55.  
  56. #define DBG_ATTR_DOS_PORTS_MARK         0x5A
  57.  
  58. #define DBG_ATTR_TITLES                 0x5D//0x71      //white 0
  59.  
  60.  
  61. //=============================================================================
  62. void show_time()
  63. {
  64.  
  65. //переместить в debug.h !!!!
  66. #define DBG_ATTR_TIME_DELTA             0x0F    //0x0F  //0x0F
  67. #define DBG_ATTR_TIME_DELTA_DARK        0x0C //0x0C     //0x0F
  68.  
  69.     unsigned char current_back_attr = (activedbg == WND_TIME_DELTA)  ?  DBG_ATTR_BCKGRND_ACTIVE : //(выделенное окно)
  70.                                                                         DBG_ATTR_BCKGRND;                                      
  71. //  unsigned char attr_values = (current_back_attr | DBG_ATTR_PORTS_VALUES);
  72. //  unsigned char attr_names = (current_back_attr | DBG_ATTR_PORTS_NAMES);  
  73.    
  74.    
  75.  
  76.     Z80 &cpu = CpuMgr.Cpu();
  77.     tprint(     time_x,
  78.                 time_y,
  79.                 "Time delta:",
  80.                 ( DBG_ATTR_TIME_DELTA_DARK | current_back_attr )        //W_OTHEROFF
  81.           );
  82.     char text[ 32];
  83.  
  84.     __int64 temp_cpu_delta = cpu.Delta();
  85.     //-------------------------------------------------------------------------
  86.     if ((temp_cpu_delta > 99999'99999'999 ) || ( temp_cpu_delta < 0 ))  //сокращаем до 8 дней в турбе?                    
  87.         temp_cpu_delta = 99999'99999'999;                               //а было до 80 дней в турбе
  88.     //-------------------------------------------------------------------------
  89.     sprintf(    text,
  90.                 "%14I64d",
  91.                 temp_cpu_delta //cpu.Delta()
  92.            );
  93.     tprint(     time_x + 10,    //11,
  94.                 time_y,
  95.                 text,
  96.                 ( DBG_ATTR_TIME_DELTA | current_back_attr )     //W_OTHER
  97.           );
  98.     tprint(     time_x + 24,    //25,
  99.                 time_y,
  100.                 ".t",
  101.                 ( DBG_ATTR_TIME_DELTA_DARK | current_back_attr ) //W_OTHEROFF
  102.           );
  103.     frame(      time_x,
  104.                 time_y,
  105.                 26,
  106.                 1,
  107.                 FRAME
  108.         );
  109. }
  110. //=============================================================================
  111.  
  112.  
  113.  
  114. //=============================================================================
  115. // отрисовка 1-й линии вачесов
  116. static void wtline(const char *name, unsigned ptr, unsigned y)
  117. {
  118.     unsigned char current_back_attr = (activedbg == WND_WATCHES)   ?    DBG_ATTR_BCKGRND_ACTIVE : //(выделенное окно)
  119.                                                                         DBG_ATTR_BCKGRND;                                                              
  120.     char line[ 40];
  121.     //-------------------------------------------------------------------------
  122.     if (name)
  123.         sprintf( line, "%3s: ", name);
  124.     //-------------------------------------------------------------------------
  125.     else
  126.         sprintf( line, "%04X ", ptr);
  127.     //-------------------------------------------------------------------------
  128.     tprint(     wat_x,
  129.                 wat_y + y,
  130.                 line,
  131.                 ( DBG_ATTR_WATCH_NAMES | current_back_attr )    //W_OTHER
  132.            );
  133.          
  134.     Z80 &cpu = CpuMgr.Cpu();
  135.     //-------------------------------------------------------------------------
  136.     for (unsigned dx = 0;    dx < 8;    dx++)
  137.     {
  138.         unsigned char c = cpu.DirectRm( ptr++);
  139.         sprintf( line + 5 + (3 * dx), "%02X", c);
  140. //      sprintf(line+3*dx, "%02X", c);
  141.         line[ 7 + (3 * dx)] = ' ';
  142.         line[ 29 + dx] = char( c  ?  c   :
  143.                                     '.' );
  144.     }
  145.     //-------------------------------------------------------------------------
  146.     line[ 37] = 0;
  147.     tprint(     wat_x + 5,
  148.                 wat_y + y,
  149.                 line + 5,
  150.                 ( DBG_ATTR_WATCH_VALUES | current_back_attr )   //W_OTHER
  151.            );
  152. }
  153. //=============================================================================
  154.  
  155.  
  156. //=============================================================================
  157. void showwatch()
  158. {
  159.     //-------------------------------------------------------------------------
  160.     // вместо того чтобы рисовать превиев поверх
  161.     // в унриале НАХУЯТО рисовали превиев первым
  162.     // а в месте превиева естьквадрат с "прозрачным" атрибутом...
  163.     // :face_palm:
  164.     //
  165.     // НО так у нас 481 1байт записей + 2,3К проверок
  166.     //
  167.     // а без прозрачного кубика будет
  168.     // +15392 чтений таблицы +15392 записей 32битов
  169.     // что возможно будет медленее
  170.     if (show_scrshot)
  171.     {
  172.         for (unsigned y = 0;    y < wat_sz;    y++)
  173.             for (unsigned x = 0;    x < 37;    x++)
  174.                 txtscr[ s80 * s30 +  (wat_y + y) * s80 + (wat_x + x)] = 0xFF;
  175.     }
  176.     //-------------------------------------------------------------------------
  177.     else
  178.     {
  179.         Z80 &cpu = CpuMgr.Cpu();
  180.         /*
  181.         wtline( "PC",   cpu.pc,         0 );
  182.         wtline( "SP",   cpu.sp,         1 );
  183.         wtline( "BC",   cpu.bc,         2 );
  184.         wtline( "DE",   cpu.de,         3 );
  185.         wtline( "HL",   cpu.hl,         4 );
  186.         wtline( "IX",   cpu.ix,         5 );
  187.         wtline( "IY",   cpu.iy,         6 );
  188.         wtline( "BC'",  cpu.alt.bc,     7 );
  189.         wtline( "DE'",  cpu.alt.de,     8 );
  190.         wtline( "HL'",  cpu.alt.hl,     9 );
  191.         */
  192.  
  193.         wtline( "BC ",  cpu.bc,         0 );
  194.         wtline( "DE ",  cpu.de,         1 );
  195.         wtline( "HL ",  cpu.hl,         2 );
  196.         wtline( "BC'",  cpu.alt.bc,     3 );
  197.         wtline( "DE'",  cpu.alt.de,     4 );
  198.         wtline( "HL'",  cpu.alt.hl,     5 );
  199.         wtline( "IX ",  cpu.ix,         6 );
  200.         wtline( "IY ",  cpu.iy,         7 );
  201.         wtline( "SP ",  cpu.sp,         8 );
  202.         wtline( "PC ",  cpu.pc,         9 );
  203.  
  204.         wtline( nullptr, user_watches[0], 10 );
  205.         wtline( nullptr, user_watches[1], 11 );
  206.         wtline( nullptr, user_watches[2], 12 );
  207.     }
  208.     //-------------------------------------------------------------------------
  209.     const char *text = "Watches";
  210.     //-------------------------------------------------------------------------
  211.     switch (show_scrshot)
  212.     {
  213.         case 1: text = "Screen Memory";         break;
  214.         case 2: text = "Shadow Screen Memory";  break;
  215.         case 3: text = "Ray-Painted";           break;
  216.     }
  217.     //-------------------------------------------------------------------------
  218.     tprint(     wat_x,
  219.                 wat_y - 1,
  220.                 text,
  221.                 DBG_ATTR_TITLES         //W_TITLE
  222.           );
  223.     //-------------------------------------------------------------------------
  224.     if (comp.flags & CF_DOSPORTS)
  225.     {
  226.         tprint(         wat_x + 34,
  227.                         wat_y - 1,
  228.                         "DOS",
  229.                         DBG_ATTR_DOS_PORTS_MARK //W_DOS
  230.               );
  231.     }
  232.     frame(      wat_x,
  233.                 wat_y,
  234.                 37,
  235.                 wat_sz,
  236.                 FRAME
  237.           );
  238. }
  239. //=============================================================================
  240.  
  241.  
  242.  
  243. //=============================================================================
  244. // set user-defined watch address
  245. // 4000 8000 С000 в окне вачесов                   // "mon.setwatch" хоткей
  246. void mon_setwatch()                            
  247. {
  248.     //-------------------------------------------------------------------------
  249.     if (show_scrshot)
  250.         show_scrshot = 0;
  251.     //-------------------------------------------------------------------------
  252.     for (unsigned i = 0;    i < 3;    i++)
  253.     {
  254.         debugscr();
  255.         int addr = input4(      wat_x,
  256.                                 wat_y + wat_sz - 3 + i,
  257.                                 user_watches[ i]
  258.                           );
  259.         //---------------------------------------------------------------------
  260.         if (addr == -1)
  261.             return;
  262.         //---------------------------------------------------------------------
  263.         user_watches[ i] = unsigned( addr);
  264.     }
  265.     //-------------------------------------------------------------------------
  266. }
  267. //=============================================================================
  268.  
  269.  
  270.  
  271. //=============================================================================
  272. void showstack()
  273. {
  274.     unsigned char current_back_attr = (activedbg == WND_STACK)   ?      DBG_ATTR_BCKGRND_ACTIVE : //(выделенное окно)
  275.                                                                         DBG_ATTR_BCKGRND;      
  276.     Z80 &cpu = CpuMgr.Cpu();
  277.     int sp_pos;
  278.     //-------------------------------------------------------------------------
  279.     for (unsigned i = 0;    i < stack_size;    i++)
  280.     {
  281.         sp_pos = i - 3;
  282.    
  283.         char xx[ 10];   //-2:1234
  284.                         //SP:1234
  285.                         //+2:
  286.         //---------------------------------------------------------------------
  287.         if (sp_pos < 0) //(!i)
  288.         {
  289.             //*(unsigned*)xx = WORD2('-','2');
  290.             //sprintf(  xx,"-2:");
  291.             sprintf(    xx,
  292.                         "-%X:",( (abs( sp_pos)) * 2)
  293.                     );
  294.         }
  295.         //---------------------------------------------------------------------
  296.         else if (sp_pos == 0) //(i == 1)
  297.         {
  298.             //*(unsigned*)xx = WORD2('S','P');
  299.             sprintf(    xx,"SP:");
  300.         }
  301.         //---------------------------------------------------------------------
  302.         else
  303.         {
  304.             sprintf(    xx,
  305.                         (sp_pos > 8) ?  "%X:" :
  306.                                         "+%X:",
  307.                         ((sp_pos) * 2)
  308.                     );
  309.         }
  310.         //---------------------------------------------------------------------
  311.         tprint(         stack_x,
  312.                         stack_y + i,
  313.                         xx,
  314.                         (sp_pos == 0) ? (DBG_ATTR_STACK_NAME_SP | current_back_attr) :
  315.                                         (DBG_ATTR_STACK_NAMES   | current_back_attr)    //W_OTHER
  316.                 );
  317.         //-------------------------------------------------------------------------    
  318.        
  319.         sprintf(        xx,
  320.                         "%02X%02X",
  321.                         cpu.DirectRm( cpu.sp + (sp_pos) * 2 + 1),
  322.                         cpu.DirectRm( cpu.sp + (sp_pos) * 2)
  323.                 );
  324.         tprint(         stack_x + 3,
  325.                         stack_y + i,
  326.                         xx,
  327.                         (DBG_ATTR_STACK_VALUES | current_back_attr)     //W_OTHER
  328.                 );
  329.     }
  330.     //-------------------------------------------------------------------------
  331.     tprint(     stack_x,
  332.                 stack_y - 1,
  333.                 "Stack",
  334.                 DBG_ATTR_TITLES         //W_TITLE
  335.            );
  336.     //-------------------------------------------------------------------------
  337.     frame( stack_x, stack_y, 7, stack_size, FRAME);
  338.     //-------------------------------------------------------------------------
  339. }
  340. //=============================================================================
  341.  
  342.  
  343.  
  344. //=============================================================================
  345. void show_ay()
  346. {
  347.     unsigned char current_back_attr = (activedbg == WND_AY)  ?  DBG_ATTR_BCKGRND_ACTIVE : //(выделенное окно)
  348.                                                                 DBG_ATTR_BCKGRND;
  349.                                                                        
  350.     //-------------------------------------------------------------------------
  351.     // if (!conf.sound.ay_scheme)       // так в дебагере дырка !!!
  352.     //     return;
  353.     //-------------------------------------------------------------------------
  354.         //      "0123456789_123456789_123456789_123456789_12345678",
  355.         //      "A:xxxx:xx B:xxxx:xx C:xxxx:xx N:xx Mxx E:xxxx S:xx i:xx o:xx
  356.         //      "A:xxx:xx B:xxx:xx C:xxx:xx N:xx Mxx E:xxxx S:xx i:xx o:xx
  357.         //      "A****:** B****:** C****:** N** M** E****:** ****",
  358.  
  359.                
  360. //                                      x,      y,      reg
  361.     int ay_map[16][3] = {       {       1,      0,      0x01    },      //A
  362.                                 {       3,      0,      0x00    },
  363.                                 {       6,      0,      0x08    },
  364.                                                        
  365.                                 {       10,     0,      0x03    },      //B
  366.                                 {       12,     0,      0x02    },
  367.                                 {       15,     0,      0x09    },
  368.                                                        
  369.                                 {       19,     0,      0x05    },      //C
  370.                                 {       21,     0,      0x04    },
  371.                                 {       24,     0,      0x0A    },
  372.                                                        
  373.                                 {       28,     0,      0x06    },      //noise
  374.                                                        
  375.                                 {       32,     0,      0x07    },      //mixer
  376.                                                        
  377.                                 {       36,     0,      0x0C    },      //en
  378.                                 {       38,     0,      0x0B    },
  379.                                 {       41,     0,      0x0D    },      //shape
  380.                                                        
  381.                                 {       44,     0,      0x0E    },      //port A       
  382.                                 {       46,     0,      0x0F    }       //port B
  383.  
  384.                         };
  385.        
  386.     const char *ayn = comp.active_ay ?  "Ay1" :
  387.                                         "Ay0";
  388.  
  389.     //-------------------------------------------------------------------------
  390.     if (conf.sound.ay_scheme < AY_SCHEME_QUADRO)
  391.     {
  392.         ayn = "Ay:";
  393.         comp.active_ay = 0;
  394.     }
  395.     //-------------------------------------------------------------------------
  396.     tprint(     ay_x - 3,
  397.                 ay_y,
  398.                 ayn,
  399.                 DBG_ATTR_TITLES //W_TITLE
  400.            );
  401.    
  402.     SNDCHIP *chip = &ay[ comp.active_ay];
  403.     char line[ 32];
  404.    
  405.    
  406.     tprint(     ay_x,
  407.                 ay_y,
  408.         //      "123456789_123456789_123456789_123456789_12345678",
  409.         //      "A:xxxx:xx B:xxxx:xx C:xxxx:xx N:xx Mxx E:xxxx S:xx i:xx o:xx
  410.         //      "A:xxx:xx B:xxx:xx C:xxx:xx N:xx Mxx E:xxxx S:xx i:xx o:xx
  411.         //      "A****:** B****:** C****:** N** M** E****:** ****",
  412.                 "A----:-- B----:-- C----:-- N-- M-- E----:-- ----",
  413.         //      "a****=** b****=** c****=** n** m** e****=** ****",
  414.         //      "A****#** B****#** C****#** N** M** E****#** ****",
  415.                 ( DBG_ATTR_AY_NAMES | current_back_attr )       //W_AYNUM
  416.            );
  417.                
  418.     //-------------------------------------------------------------------------
  419.     if (conf.sound.ay_scheme)
  420.     {
  421.     for (unsigned i = 0;    i < 16;    i++)
  422.     {
  423.         sprintf(        line,
  424.                         "%02X",
  425.                         chip->get_reg(ay_map[i][2])
  426.                 );
  427.         tprint(         ( ay_x + ay_map[i][0] ),
  428.                         ( ay_y + ay_map[i][1] ),
  429.                         line,
  430.                         ( ay_map[i][2] == ( chip->get_activereg() ) ) ? ( DBG_ATTR_AY_VALUES_IO | current_back_attr ):  //W_AYON :
  431.                                                                         ( DBG_ATTR_AY_VALUES | current_back_attr )      //W_AYOFF
  432.                 );
  433.     }
  434.     }
  435.     //-------------------------------------------------------------------------
  436.    
  437. /*
  438.  
  439.  
  440.  
  441.  
  442.     for (unsigned i = 0; i < 16; i++)
  443.     {
  444.         line[0] = "0123456789ABCDEF"[i];
  445.         line[1] = 0;
  446.         tprint(         ay_x + i*3,
  447.                         ay_y,
  448.                         line,
  449.                         DBG_ATTR_AY_NAMES       //W_AYNUM
  450.                 );
  451.         sprintf(        line,
  452.                         "%02X",
  453.                         chip->get_reg(i)
  454.                 );
  455.         tprint(         unsigned(ay_x + i*3 + 1),
  456.                         unsigned(ay_y),
  457.                         line,
  458.                         (i == (chip->get_activereg() ))    ?    DBG_ATTR_AY_VALUES_IO :         //W_AYON :
  459.                                                                 DBG_ATTR_AY_VALUES              //W_AYOFF
  460.                 );
  461.     }
  462. */
  463.     /*
  464.     рамочки ненужны
  465.     frame(      ay_x,
  466.                 ay_y,
  467.                 48,
  468.                 1,
  469.                 FRAME
  470.          );
  471.     */
  472. }
  473. //=============================================================================
  474.  
  475.  
  476.  
  477. //=============================================================================
  478. // switch active AY (turbo-sound)                       //"mon.switchay" хоткей
  479. void mon_switchay()                                    
  480. {                               // вместо перекючения отображаемого чипа
  481.     comp.active_ay ^= 1;        // походу клацаетсо весь чип навсегда? :rofl:
  482. }
  483. //=============================================================================
  484.  
  485.  
  486.  
  487. //=============================================================================
  488. void __cdecl BankNames( int i, char *Name)
  489. {
  490.     unsigned rom_bank;
  491.     unsigned ram_bank;
  492.  
  493.     bool IsRam = (RAM_BASE_M <= bankr[i]) && (bankr[i] < RAM_BASE_M + PAGE * MAX_RAM_PAGES);
  494.     bool IsRom = (ROM_BASE_M <= bankr[i]) && (bankr[i] < ROM_BASE_M + PAGE * MAX_ROM_PAGES);
  495.  
  496.     if (IsRam)
  497.         ram_bank = ULONG(( bankr[i] - RAM_BASE_M) / PAGE);
  498.  
  499.     if (IsRom)
  500.         rom_bank = ULONG(( bankr[i] - ROM_BASE_M) / PAGE);
  501.        
  502.     //-------------------------------------------------------------------------
  503.     if (IsRam)                          sprintf( Name,  "RAM%2X", ram_bank      );
  504.     //-------------------------------------------------------------------------
  505.     if (IsRom)                          sprintf( Name,  "ROM%2X", rom_bank      );
  506.     //-------------------------------------------------------------------------
  507.     if (bankr[ i] == base_sos_rom)      strcpy( Name,   "BASIC"                 );
  508.     //-------------------------------------------------------------------------
  509.     if (bankr[ i] == base_dos_rom)      strcpy( Name,   "TRDOS"                 );
  510.     //-------------------------------------------------------------------------
  511.     if (bankr[ i] == base_128_rom)      strcpy( Name,   "B128K"                 );
  512.     //-------------------------------------------------------------------------
  513.     if  (
  514.             (bankr[i] == base_sys_rom)
  515.              &&
  516.             (  
  517.                 (conf.mem_model == MM_PROFSCORP) ||
  518.                 (conf.mem_model == MM_SCORP)
  519.             )
  520.         )                               strcpy( Name,   "SVM  "                 );
  521.     //-------------------------------------------------------------------------
  522.     if (    (
  523.                 (conf.mem_model == MM_PROFSCORP) ||
  524.                 (conf.mem_model == MM_SCORP)
  525.             )
  526.             &&
  527.             (IsRom)
  528.             &&
  529.             (rom_bank > 3)
  530.         )                               sprintf( Name,  "ROM%2X", rom_bank      );
  531.     //-------------------------------------------------------------------------
  532.     if (bankr[i] == CACHE_M)            strcpy( Name, (conf.cache != 32)  ?  "CACHE":
  533.                                                                              "CACH0");
  534.     //-------------------------------------------------------------------------
  535.     if (bankr[i] == CACHE_M + PAGE)     strcpy( Name,   "CACH1"                 );
  536.     //-------------------------------------------------------------------------
  537. }
  538. //=============================================================================
  539.  
  540.  
  541. //=============================================================================
  542. void showbanks()
  543. {
  544.     unsigned char current_back_attr = (activedbg == WND_PAGES)  ?  DBG_ATTR_BCKGRND_ACTIVE : //(выделенное окно)
  545.                                                                    DBG_ATTR_BCKGRND;
  546.     Z80 &cpu = CpuMgr.Cpu();
  547.     //-------------------------------------------------------------------------
  548.     for (int i = 0;    i < 4;    i++)
  549.     {
  550.         char ln[ 64];
  551.         sprintf(        ln,
  552.                         "%d:", i
  553.                 );
  554.         tprint(         unsigned( banks_x),
  555.                         unsigned( banks_y + i),
  556.                         ln,
  557.                         ( DBG_ATTR_PAGES_NMB | current_back_attr)       //W_OTHEROFF
  558.                 );
  559.         strcpy( ln, "?????");
  560.         cpu.BankNames( i, ln);
  561.         tprint(         unsigned( banks_x + 2),
  562.                         unsigned( banks_y + i),
  563.                         ln,
  564.                         bankr[ i] != bankw[ i]  ?  ( DBG_ATTR_PAGES_ROM | current_back_attr) :  //W_BANKRO :
  565.                                                    ( DBG_ATTR_PAGES_RAM | current_back_attr)    //W_BANK
  566.                 );
  567.     }
  568.     //-------------------------------------------------------------------------
  569.  
  570.     frame(      banks_x,
  571.                 banks_y,
  572.                 7,
  573.                 4,
  574.                 FRAME
  575.           );
  576.     tprint(     banks_x,
  577.                 banks_y - 1,
  578.                 "Pages",
  579.                 DBG_ATTR_TITLES//W_TITLE
  580.            );
  581. }
  582.  
  583. //=============================================================================
  584. void showports()
  585. {
  586.  
  587.     unsigned char current_back_attr = (activedbg == WND_PORTS)  ?  DBG_ATTR_BCKGRND_ACTIVE :    //(выделенное окно)
  588.                                                                    DBG_ATTR_BCKGRND;                                   
  589.     unsigned char attr_values = (current_back_attr | DBG_ATTR_PORTS_VALUES);
  590.     unsigned char attr_names =  (current_back_attr | DBG_ATTR_PORTS_NAMES);    
  591.    
  592.     char ln[ 64];
  593.     //-------------------------------------------------------------------------
  594.     // FE
  595.     sprintf(    ln,
  596.                 "%02X", comp.pFE
  597.             );
  598.     tprint(     ports_x,
  599.                 ports_y,
  600.                 "  FE:",
  601.                 attr_names      //W_OTHER
  602.            );
  603.     tprint(     ports_x + 5,
  604.                 ports_y,
  605.                 ln,
  606.                 attr_values     //W_OTHER
  607.            );
  608.     //-------------------------------------------------------------------------
  609.     // 7FFD
  610.     sprintf(    ln,
  611.                 "%02X", comp.p7FFD
  612.             );
  613.     tprint(     ports_x,
  614.                 ports_y + 1,
  615.                 "7FFD:",
  616.                 attr_names
  617.            );
  618.     tprint(     ports_x + 5,
  619.                 ports_y + 1,
  620.                 ln,
  621.                 (comp.p7FFD & 0x20) &&  !(  
  622.                                             (
  623.                                                 (conf.mem_model == MM_PENTAGON) && (conf.ramsize == 1024)
  624.                                             )
  625.                                             ||
  626.                                             (
  627.                                                 (conf.mem_model == MM_PROFI) && (comp.pDFFD & 0x10)
  628.                                             )
  629.                                         )   ?   (current_back_attr | DBG_ATTR_PORTS_48_LOCK) :  //W_48K :
  630.                                                 attr_values     //W_OTHER
  631.            );
  632.     //-------------------------------------------------------------------------
  633.     switch (conf.mem_model)
  634.     {
  635.         case MM_KAY:
  636.         case MM_SCORP:
  637.         case MM_PROFSCORP:
  638.         case MM_PLUS3:
  639.             dbg_extport = 0x1FFD;
  640.             dbg_extval = comp.p1FFD;
  641.             break;
  642.         case MM_PROFI:
  643.             dbg_extport = 0xDFFD;
  644.             dbg_extval = comp.pDFFD;
  645.             break;
  646.         case MM_ATM450:
  647.             dbg_extport = 0xFDFD;
  648.             dbg_extval = comp.pFDFD;
  649.             break;
  650.         case MM_ATM710:
  651.         case MM_ATM3:
  652.             dbg_extport = (comp.aFF77 & 0xFFFF);
  653.             dbg_extval = comp.pFF77;
  654.             break;
  655.         case MM_QUORUM:
  656.             dbg_extport = 0x0000;
  657.             dbg_extval = comp.p00;
  658.             break;
  659.         default:
  660.             dbg_extport = -1U;
  661.     }
  662.     //-------------------------------------------------------------------------
  663.     // печать порта выбранного выше
  664.     if (dbg_extport != -1U)
  665.     {
  666.         sprintf(        ln,
  667.                         "%04X:", dbg_extport
  668.                 );
  669.         tprint(         ports_x,
  670.                         ports_y + 2,
  671.                         ln,
  672.                         attr_names      //W_OTHER
  673.                 );
  674.         sprintf(        ln,
  675.                         "%02X", dbg_extval
  676.                 );
  677.         tprint(         ports_x + 5,
  678.                         ports_y + 2,
  679.                         ln,
  680.                         attr_values     //W_OTHER
  681.                 );
  682.                
  683.     }
  684.     //-------------------------------------------------------------------------
  685.     // печать вместо cmos-а
  686.     else
  687.     {          
  688.         sprintf(        ln,
  689.                         "%02X", comp.cmos_addr
  690.                 );
  691.         tprint(         ports_x,
  692.                         ports_y + 2,
  693.                         "CMOS:",
  694.                         attr_names      //W_OTHER
  695.                 );
  696.         tprint(         ports_x + 5,
  697.                         ports_y + 2,
  698.                         ln,
  699.                         attr_values     //W_OTHER
  700.                 );
  701.     }  
  702.     //-------------------------------------------------------------------------
  703.     // EFF7
  704.     sprintf(    ln,
  705.                 "%02X", comp.pEFF7
  706.             );    
  707.     tprint(     ports_x,
  708.                 ports_y + 3,
  709.                 "EFF7:",
  710.                 attr_names      //W_OTHER
  711.            );  
  712.     tprint(     ports_x + 5,
  713.                 ports_y + 3,
  714.                 ln,
  715.                 attr_values     //W_OTHER
  716.            );
  717.     //-------------------------------------------------------------------------
  718.     frame(      ports_x,
  719.                 ports_y,
  720.                 7,
  721.                 4,
  722.                 FRAME
  723.           );
  724.          
  725.     tprint(     ports_x,
  726.                 ports_y - 1,
  727.                 "Ports",
  728.                 DBG_ATTR_TITLES //W_TITLE
  729.            );
  730. }
  731. //=============================================================================
  732.  
  733.  
  734. //=============================================================================
  735. void showdos()
  736. {
  737. //    CD:802E
  738. //    STAT:24
  739. //    SECT:00
  740. //    T:00/01
  741. //    S:00/00
  742. //[vv]   if (conf.trdos_present) comp.wd.process();
  743.  
  744.     unsigned char current_back_attr = (activedbg == WND_BETA128)  ?  DBG_ATTR_BCKGRND_ACTIVE :  //(выделенное окно)
  745.                                                                      DBG_ATTR_BCKGRND;                                 
  746.     unsigned char attr_values = conf.trdos_present  ?  (current_back_attr | DBG_ATTR_BETA128_VALUES)    :
  747.                                                        (current_back_attr | DBG_ATTR_BETA128_OFF)       ;
  748.  
  749.     unsigned char attr_names = (current_back_attr | DBG_ATTR_BETA128_NAMES);
  750.  
  751.  
  752.     char ln[ 64];
  753.     unsigned char atr = conf.trdos_present  ?  W_OTHER :
  754.                                                W_OTHEROFF;
  755.     //-------------------------------------------------------------------------
  756.     sprintf( ln, "%02X%02X", comp.wd.cmd, comp.wd.data);
  757.     tprint(     dos_x,
  758.                 dos_y,
  759.                 "CD:",
  760.                 attr_names      //atr
  761.         );
  762.     tprint(     dos_x + 3,
  763.                 dos_y,
  764.                 ln,
  765.                 attr_values     //atr
  766.         );
  767.     //-------------------------------------------------------------------------
  768.     sprintf( ln, "%02X", comp.wd.RdStatus() );
  769.     tprint(     dos_x,
  770.                 dos_y + 1,
  771.                 "STAT:",
  772.                 attr_names      //atr
  773.            );
  774.     tprint(     dos_x + 5,
  775.                 dos_y + 1,
  776.                 ln,
  777.                 attr_values     //atr
  778.            );
  779.  
  780.     //-------------------------------------------------------------------------
  781.     sprintf( ln, "%02X", comp.wd.sector );
  782.     tprint(     dos_x,
  783.                 dos_y + 2,
  784.                 "SECT:",
  785.                 attr_names      //atr
  786.            );
  787.     tprint(     dos_x + 5,
  788.                 dos_y + 2,
  789.                 ln,
  790.                 attr_values     //atr
  791.            );
  792.     //-------------------------------------------------------------------------
  793.     sprintf( ln, "%02X/%02X", comp.wd.seldrive->track, comp.wd.track );
  794.     tprint(     dos_x,
  795.                 dos_y + 3,
  796.                 "T:",
  797.                 attr_names      //atr
  798.            );
  799.     tprint(     dos_x + 2,
  800.                 dos_y + 3,
  801.                 ln,
  802.                 attr_values     //atr
  803.            );
  804.     //-------------------------------------------------------------------------
  805.     sprintf( ln, "%02X/%02X", comp.wd.system, comp.wd.rqs );
  806.     tprint(     dos_x,
  807.                 dos_y + 4,
  808.                 "S:",
  809.                 attr_names      //atr
  810.            );
  811.     tprint(     dos_x + 2,
  812.                 dos_y + 4,
  813.                 ln,
  814.                 attr_values     //atr
  815.            );
  816.     //-------------------------------------------------------------------------
  817.     frame( dos_x, dos_y, 7, 5, FRAME);
  818.     //-------------------------------------------------------------------------
  819. #if 1
  820.     tprint(     dos_x,
  821.                 dos_y-1,
  822.                 "Beta128",
  823.                 DBG_ATTR_TITLES//W_TITLE
  824.            );
  825. #else
  826.     sprintf( ln, "%X-%X %d", comp.wd.state, comp.wd.state2, comp.wd.seldrive->track );
  827.     tprint(     dos_x,
  828.                 dos_y-1,
  829.                 ln,
  830.                 atr
  831.            );
  832. #endif
  833. /*
  834. // уже не компилируемый код
  835.  
  836. //    STAT:00101010
  837. //    CMD:80,STA:2A
  838. //    DAT:22,SYS:EE
  839. //    TRK:31,SEC:01
  840. //    DISK:A,SIDE:0
  841.  
  842.    char ln[64]; unsigned char atr = conf.trdos_present ? 0x20 : 0x27;
  843.    sprintf(ln, "STAT:00000000"); unsigned char stat = in_trdos(0x1F);
  844.    for (int i = 0; i < 7; i++) ln[i+5] = (stat & (0x80 >> i)) ? '1':'0';
  845.    tprint(dos_x, dos_y+1, ln, atr);
  846.    sprintf(ln, "CMD:%02X,STA:%02X", comp.trdos.cmd, stat);
  847.    tprint(dos_x, dos_y+2, ln, atr);
  848.    sprintf(ln, "DAT:%02X,SYS:%02X", comp.trdos.data, in_trdos(0xFF));
  849.    tprint(dos_x, dos_y+3, ln, atr);
  850.    sprintf(ln, "TRK:%02X,SEC:%02X", comp.trdos.track, comp.trdos.sector);
  851.    tprint(dos_x, dos_y+4, ln, atr);
  852.    sprintf(ln, "DISK:%c,SIDE:%c", 'A'+(comp.trdos.system & 3), (comp.trdos.system & 0x10) ? '0':'1');
  853.    tprint(dos_x, dos_y+5, ln, atr);
  854.    frame(dos_x, dos_y+1, 13, 5, FRAME);
  855.    tprint(dos_x, dos_y, "beta128", 0x83);
  856. */
  857. }
  858. //=============================================================================
  859.  
  860.  
  861.  
  862. //=============================================================================
  863. #ifdef MOD_GSBASS
  864.  
  865. // менюшка BASS mod ripper-а
  866. static INT_PTR CALLBACK gsdlg( HWND dlg, UINT msg, WPARAM wp, LPARAM lp)
  867. {
  868.     (void)lp;
  869.  
  870.     char tmp[ 0x200];
  871.     unsigned i;                                 // Alone Coder 0.36.7
  872.     HWND lv = GetDlgItem( dlg, IDC_GSLIST);
  873.    
  874.     //-------------------------------------------------------------------------
  875.     if (msg == WM_INITDIALOG)
  876.     {
  877.         ListView_SetExtendedListViewStyleEx(    lv,
  878.                                                 LVS_EX_FULLROWSELECT,
  879.                                                 LVS_EX_FULLROWSELECT
  880.                                             );
  881.         LVCOLUMN Col = { };
  882.  
  883.         static const char *Cols[] = { "", "smp", "v", "n", "p", "f", "l" };
  884.         static const int Width[] =  { 30,   100,  40,  40,  40,  70,  70 };
  885.  
  886.         Col.mask = LVCF_TEXT | LVCF_WIDTH;
  887.         //---------------------------------------------------------------------
  888.         for (i = 0;    i < _countof( Cols);    i++)
  889.         {
  890.             Col.pszText = LPSTR( Cols[ i]);
  891.             Col.cx = Width[ i];
  892.             ListView_InsertColumn(      lv,
  893.                                         i,
  894.                                         &Col
  895.                                   );
  896.         }
  897.         //---------------------------------------------------------------------
  898.         if (gs.modsize)
  899.         {
  900.             sprintf(    tmp,
  901.                         "(%s)", gs.mod_playing  ?  "P" :
  902.                                                    "S"
  903.                     );
  904.             LVITEM Item = { };
  905.             Item.mask = LVIF_TEXT;
  906.             Item.iItem = 0;
  907.             Item.iSubItem = 0;
  908.             Item.pszText = tmp;
  909.             ListView_InsertItem(  lv,
  910.                                   &Item
  911.                                 );
  912.  
  913.             sprintf(    tmp,
  914.                         "%.20s", gs.mod
  915.                     );
  916.             tmp[ 20] = 0;
  917.             Item.iSubItem++;
  918.             Item.pszText = tmp;
  919.             ListView_SetItem(   lv,
  920.                                 &Item
  921.                              );
  922.         }
  923.         //---------------------------------------------------------------------
  924.         for (i = 1;    i < gs.total_fx;    i++)
  925.         {
  926.             sprintf(    tmp,
  927.                         "%s%s", (gs.cur_fx == i)  ?  "*" :
  928.                                                      ""  ,
  929.                         gs.sample[ i].loop < gs.sample[i].end  ?  "(L)" :
  930.                                                                   ""
  931.                     );
  932.             LVITEM Item = { };
  933.             Item.mask = LVIF_TEXT;
  934.             Item.iItem = int(i);
  935.             Item.iSubItem = 0;
  936.             Item.pszText = tmp;
  937.             ListView_InsertItem(        lv,
  938.                                         &Item
  939.                                 );
  940.             sprintf(    tmp,
  941.                         "%u", i
  942.                     );
  943.             Item.iSubItem++;
  944.             ListView_SetItem( lv, &Item);
  945.  
  946.             sprintf( tmp, "%u", unsigned( gs.sample[ i].volume));
  947.             Item.iSubItem++;
  948.             ListView_SetItem( lv, &Item);
  949.  
  950.             sprintf( tmp, "%u", unsigned( gs.sample[ i].note));
  951.             Item.iSubItem++;
  952.             ListView_SetItem(lv, &Item);
  953.            
  954.             sprintf( tmp, "%u", unsigned( gs.sample[ i].Priority));
  955.             Item.iSubItem++;
  956.             ListView_SetItem(lv, &Item);
  957.            
  958.             sprintf( tmp, "%.2f", double( gs.note2rate[ gs.sample[ i].note]));
  959.             Item.iSubItem++;
  960.             ListView_SetItem( lv, &Item);
  961.  
  962.             sprintf(tmp, "%u", gs.sample[ i].end);
  963.             Item.iSubItem++;
  964.             ListView_SetItem( lv, &Item);
  965.         }
  966.         //---------------------------------------------------------------------
  967.         int Sel = ListView_GetItemCount( lv);
  968.         //---------------------------------------------------------------------
  969.         if (Sel > 0)
  970.         {
  971.             LVITEM Item = { };
  972.             Item.stateMask = LVIS_SELECTED;
  973.             Item.state = LVIS_SELECTED;
  974.             SendMessage( lv, LVM_SETITEMSTATE, WPARAM( 0), LPARAM( &Item));
  975.             SetFocus( lv);
  976.         }
  977.         //---------------------------------------------------------------------
  978.         *tmp = 0;
  979.         //---------------------------------------------------------------------
  980.         for (i = 0;    i < 0x100;    i++)
  981.         {
  982.             if (gs.badgs[ i])
  983.             {
  984.                 sprintf( tmp + strlen( tmp), "%02X ", i);
  985.             }
  986.         }
  987.         //---------------------------------------------------------------------
  988.         Edit_SetText( GetDlgItem( dlg, IDE_GS), tmp);
  989.  
  990.         return Sel  ?  FALSE :
  991.                        TRUE;
  992.     }
  993.     //-------------------------------------------------------------------------
  994.     if (msg == WM_SYSCOMMAND && (wp & 0xFFF0) == SC_CLOSE)
  995.     {
  996.         EndDialog( dlg, 0);
  997.     }
  998.     //-------------------------------------------------------------------------
  999.     unsigned id;
  1000.     unsigned nc;
  1001.     //-------------------------------------------------------------------------
  1002.     switch (msg)
  1003.     {
  1004.         //---------------------------------------------------------------------
  1005.         case WM_NOTIFY:
  1006.         {
  1007.             LPNMHDR Hdr = LPNMHDR(lp);
  1008.             id = unsigned( Hdr->idFrom);
  1009.             nc = Hdr->code;
  1010.         }
  1011.         break;
  1012.         //---------------------------------------------------------------------
  1013.         case WM_COMMAND:
  1014.             id = LOWORD( wp);
  1015.             nc = HIWORD( wp);
  1016.             break;
  1017.         //---------------------------------------------------------------------
  1018.         default:
  1019.             return FALSE;
  1020.         //---------------------------------------------------------------------
  1021.     }
  1022.     //-------------------------------------------------------------------------
  1023.  
  1024.     //-------------------------------------------------------------------------
  1025.     if ((id == IDCANCEL || id == IDOK) && (nc == BN_CLICKED))
  1026.     {
  1027.         EndDialog( dlg, 0);
  1028.     }
  1029.     //-------------------------------------------------------------------------
  1030.     if ((id == IDB_GS_CLEAR) && (nc == BN_CLICKED))
  1031.     {
  1032.         memset( gs.badgs, 0, sizeof gs.badgs);
  1033.         Edit_SetText( GetDlgItem( dlg, IDE_GS), "");
  1034.         return TRUE;
  1035.     }
  1036.     //-------------------------------------------------------------------------
  1037.     if ((id == IDB_GS_RESET) && (nc == BN_CLICKED))
  1038.     {
  1039.         gs.reset();
  1040.         ListView_DeleteAllItems( lv);
  1041.         return TRUE;
  1042.     }
  1043.     //-------------------------------------------------------------------------
  1044.     if (((id == IDB_GS_PLAY) && (nc == BN_CLICKED)) || ((id == IDC_GSLIST) && (nc == NM_DBLCLK)))
  1045.     {
  1046.         unsigned i = unsigned( ListView_GetSelectionMark( lv));
  1047.         //---------------------------------------------------------------------
  1048.         if (i > 0x100)
  1049.         {
  1050.             return TRUE;
  1051.         }
  1052.         //---------------------------------------------------------------------
  1053.         if (!i && gs.modsize)
  1054.         {
  1055.             gs.mod_playing ^= 1;
  1056.             //-----------------------------------------------------------------
  1057.             if (gs.mod_playing)
  1058.             {
  1059.                 gs.restart_mod( 0, 0);
  1060.             }
  1061.             //-----------------------------------------------------------------
  1062.             else
  1063.             {
  1064.                 gs.stop_mod();
  1065.             }
  1066.             //-----------------------------------------------------------------
  1067.  
  1068.             sprintf( tmp, "(%s)", gs.mod_playing  ?  "P" :
  1069.                                                      "S");
  1070.             LVITEM Item = { };
  1071.             Item.mask = LVIF_TEXT;
  1072.             Item.pszText = tmp;
  1073.             ListView_SetItem( lv, &Item);
  1074.  
  1075.             return TRUE;
  1076.         }
  1077.         //---------------------------------------------------------------------
  1078.         if (!gs.modsize)
  1079.         {
  1080.             i++;
  1081.         }
  1082.         //---------------------------------------------------------------------
  1083.         gs.debug_note( i);
  1084.         return TRUE;
  1085.     }
  1086.     //-------------------------------------------------------------------------
  1087.     if ((id == IDB_GS_SAVE) && (nc == BN_CLICKED))
  1088.     {
  1089.         unsigned i = unsigned( ListView_GetSelectionMark( lv));
  1090.         //---------------------------------------------------------------------
  1091.         if ((i == 0) && (gs.modsize != 0))
  1092.         {
  1093.             SaveModDlg( wnd);
  1094.             return TRUE;
  1095.         }
  1096.         //---------------------------------------------------------------------
  1097.         if (i > 0x100)
  1098.         {
  1099.             return TRUE;
  1100.         }
  1101.         //---------------------------------------------------------------------
  1102.         OPENFILENAME ofn = { };
  1103.         char sndsavename[ MAX_PATH];
  1104.         *sndsavename = 0;
  1105.         ListView_GetItemText( lv, i, 1, sndsavename, _countof( sndsavename));
  1106.         strcat( sndsavename, ".pcm");
  1107.  
  1108.         ofn.lStructSize = (WinVerMajor < 5)  ?  OPENFILENAME_SIZE_VERSION_400 :
  1109.                                                 sizeof( OPENFILENAME);
  1110.         ofn.lpstrFilter = "PCM sample (.pcm)\0*.pcm\0";
  1111.         ofn.lpstrFile = sndsavename;
  1112.         ofn.lpstrDefExt = "pcm";
  1113.         ofn.nMaxFile = _countof( sndsavename);
  1114.         ofn.lpstrTitle = "Save Sample";
  1115.         ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_NOCHANGEDIR | OFN_EXPLORER | OFN_ENABLESIZING;
  1116.         ofn.hwndOwner = wnd;
  1117.         ofn.nFilterIndex = 1;
  1118.         //---------------------------------------------------------------------
  1119.         if (GetSaveFileName( &ofn))
  1120.         {
  1121.             gs.debug_save_note( i, sndsavename);
  1122.         }
  1123.         //---------------------------------------------------------------------
  1124.         return TRUE;
  1125.     }
  1126.     //-------------------------------------------------------------------------
  1127.     return FALSE;
  1128. }
  1129. //=============================================================================
  1130.  
  1131.  
  1132.  
  1133. //=============================================================================
  1134. void mon_gsdialog()                                             //"mon.gs" хоткей
  1135. {
  1136.     //-------------------------------------------------------------------------
  1137.     if (conf.gs_type == 2)
  1138.     {
  1139.         DialogBox( hIn, MAKEINTRESOURCE( IDD_GS), wnd, gsdlg);
  1140.     }
  1141.     //-------------------------------------------------------------------------
  1142.     else
  1143.     {
  1144.         MessageBox( wnd, "high-level GS emulation\nis not initialized", nullptr, MB_OK | MB_ICONERROR);
  1145.     }
  1146.     //-------------------------------------------------------------------------
  1147. }
  1148. #else
  1149. void mon_gsdialog() {}
  1150. #endif
  1151. //=============================================================================
  1152.