Subversion Repositories pentevo

Rev

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

  1. #include "std.h"
  2.  
  3. #include "emul.h"
  4. #include "vars.h"
  5. #include "debug.h"
  6. #include "dbgpaint.h"
  7. #include "dbgcmd.h"
  8. #include "dbgmem.h"
  9. #include "wd93crc.h"
  10. #include "util.h"
  11.  
  12. static TRKCACHE edited_track;
  13.  
  14. static unsigned sector_offset, sector;
  15.  
  16. //=============================================================================
  17. static void findsector(unsigned addr)
  18. {
  19.    for (sector_offset = sector = 0; sector < edited_track.s; sector++, sector_offset += edited_track.hdr[sector].datlen)
  20.       if (addr >= sector_offset && addr < sector_offset + edited_track.hdr[sector].datlen)
  21.          return;
  22.    errexit("internal diskeditor error");
  23. }
  24. //=============================================================================
  25.  
  26.  
  27. //=============================================================================
  28. unsigned char *editam(unsigned addr)
  29. {
  30.    Z80 &cpu = CpuMgr.Cpu();
  31.    if (editor == ED_CMOS)       return &cmos[addr & (sizeof(cmos)-1)];
  32.    if (editor == ED_NVRAM)      return &nvram[addr & (sizeof(nvram)-1)];
  33.    if (editor == ED_COMP_PAL)   return &comp.comp_pal[addr & (sizeof(comp.comp_pal) - 1)];
  34.    if (editor == ED_MEM)        return cpu.DirectMem(addr);
  35.    if (!edited_track.trkd)      return nullptr;
  36.    if (editor == ED_PHYS)       return edited_track.trkd + addr;
  37.    // editor == ED_LOG
  38.         findsector(addr);
  39.         return edited_track.hdr[sector].data + addr - sector_offset;
  40. }
  41. //=============================================================================
  42.  
  43.  
  44. //=============================================================================
  45. static void editwm(unsigned addr, unsigned char byte)
  46. {
  47.    if (editrm(addr) == byte) return;
  48.    unsigned char *ptr = editam(addr);
  49.    if (!ptr) return;
  50.    *ptr = byte;
  51.    if ( (editor == ED_MEM)      ||
  52.         (editor == ED_CMOS)     ||
  53.         (editor == ED_NVRAM)    ||
  54.         (editor == ED_COMP_PAL)
  55.      )
  56.    {
  57.        if (editor == ED_COMP_PAL)
  58.        {
  59.            temp.comp_pal_changed = 1;
  60.        }
  61.        return;
  62.    }
  63.    if (editor == ED_PHYS) { comp.fdd[mem_disk].optype |= 2;     return; }
  64.    comp.fdd[mem_disk].optype |= 1;
  65.    // recalc sector checksum
  66.    findsector(addr);
  67.    *(unsigned short*)(edited_track.hdr[sector].data + edited_track.hdr[sector].datlen) =
  68.       u16(wd93_crc(edited_track.hdr[sector].data - 1, edited_track.hdr[sector].datlen + 1));
  69. }
  70. //=============================================================================
  71.  
  72.  
  73. //=============================================================================
  74. unsigned memadr(unsigned addr)
  75. {
  76.    if (editor == ED_MEM)        return (addr & 0xFFFF);
  77.    if (editor == ED_CMOS)       return (addr & (sizeof(cmos)-1));
  78.    if (editor == ED_NVRAM)      return (addr & (sizeof(nvram)-1));
  79.    if (editor == ED_COMP_PAL)   return (addr & (sizeof(comp.comp_pal) - 1));
  80.    // else if (editor == ED_PHYS || editor == ED_LOG)
  81.    if (!mem_max) return 0;
  82.    while ((int)addr < 0) addr += mem_max;
  83.    while (addr >= mem_max) addr -= mem_max;
  84.    return addr;
  85. }
  86. //=============================================================================
  87.  
  88.  
  89. //=============================================================================
  90. void showmem()
  91. {
  92.  
  93. //переместить в debug.h !!!!
  94. #define DBG_ATTR_BCKGRND                0x00    //0     0
  95. #define DBG_ATTR_BCKGRND_ACTIVE         0x10    //blue  0
  96. #define DBG_ATTR_BCKGRND_BRIGHT         0X80    //br+   0
  97.  
  98. #define DBG_ATTR_MEM_VALUES             0x0F    //0     br+WHITE
  99. #define DBG_ATTR_MEM_SELECTED           0xB0    //br+MAGENTAA   0
  100.  
  101. #define DBG_ATTR_MEM_DUMP_TYPE          0x5D//0x70      //white 0
  102. //#define DBG_ATTR_MEM_NGS_DMA          0x70    //white 0
  103.  
  104.  
  105. #define DBG_ATTR_MEM_BREAK_EX           0x0A    //0             red
  106.  
  107. #define DBG_ATTR_MEM_BREAK_R            0x04    //0             red
  108. #define DBG_ATTR_MEM_BREAK_W            0x02    //0             green
  109. #define DBG_ATTR_MEM_BREAK_RW           0x06    //0             yellow
  110. #define DBG_ATTR_MEM_BREAK_R_BACK       0x40    //red           0
  111. #define DBG_ATTR_MEM_BREAK_W_BACK       0x20    //green         0
  112. #define DBG_ATTR_MEM_BREAK_RW_BACK      0x60    //yellow        0
  113.  
  114.  
  115. #define DBG_ATTR_MEM_REG_PC             0x0D    //0             br+CYAN
  116. #define DBG_ATTR_MEM_TRACE_CURSOR       0x0B    //0             br+MAGENTA      0x0E    //0             br+YELLOW
  117.  
  118.  
  119.  
  120. // #define DBG_ATTR_REGS_NAMES  0x07    //0     br+WHITE
  121.  
  122. // #define DBG_ATTR_REGS_SELECTED       0xB0    //br+MAGENTAA   0
  123. // #define DBG_ATTR_REGS_CHANGED        0X0E    //0     br+YELLOW
  124. // #define DBG_ATTR_REGS_DIHALT 0x0A    //0     br+RED
  125. //
  126. // #define DBG_ATTR_REGS_TITLE  0x51    //cyan blue
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.     Z80 &cpu = CpuMgr.Cpu();
  134.  
  135. //  char line[80];
  136.     char line[ 80] = "                                                    ";
  137.    
  138.     char value[ 16] = "    ";   //NS    (чтобы красить каждый символ по отдельности)
  139.    
  140.     char char_1[ 16] = " ";
  141.    
  142.     unsigned ii;
  143.     unsigned cursor_found = 0;
  144.    
  145.     unsigned char current_back_attr = (activedbg == WNDMEM) ?   DBG_ATTR_BCKGRND_ACTIVE :       //(выделенное окно)
  146.                                                                 DBG_ATTR_BCKGRND;
  147.  
  148.     unsigned char attr_values = (current_back_attr | DBG_ATTR_MEM_VALUES);
  149.  
  150.     filledframe(        mem_x,                  // тк не все строки могут отрисовыватсо
  151.                         mem_y,
  152.                         mem_cx,
  153.                         mem_cy,
  154.                         current_back_attr );
  155.                        
  156.                        
  157.     if (mem_dump)
  158.     {
  159.         mem_ascii = 1;
  160.         mem_sz = 32;
  161.     }
  162.     else
  163.     {
  164.         mem_sz = 8;
  165.     }
  166.     //-------------------------------------------------------------------------
  167.     if (editor == ED_LOG || editor == ED_PHYS)
  168.     {
  169.         edited_track.clear();
  170.         edited_track.seek(comp.fdd+mem_disk, mem_track/2, mem_track & 1, (editor == ED_LOG)? LOAD_SECTORS : JUST_SEEK);
  171.        
  172.         //---------------------------------------------------------------------
  173.         if (!edited_track.trkd)         // no track
  174.         {
  175.             for (ii = 0; ii < mem_size; ii++)
  176.             {
  177.                         sprintf(line, (ii == mem_size/2)   ?    "          track not found            " :
  178.                                                                 "                                     " );
  179.                 // error
  180.                 tprint(         mem_x,
  181.                                 mem_y+ii,
  182.                                 line,
  183.                                 attr_values     //(activedbg == WNDMEM) ?       W_SEL   :
  184.                                                 //                              W_NORM
  185.                        );
  186.             }
  187.             mem_max = 0;        //| title
  188.             goto title;         //v down
  189.         }
  190.         //---------------------------------------------------------------------
  191.         mem_max = edited_track.trklen;
  192.         if (editor == ED_LOG)
  193.             for (mem_max = ii = 0; ii < edited_track.s; ii++)
  194.                 mem_max += edited_track.hdr[ii].datlen;
  195.     }
  196.     //-------------------------------------------------------------------------
  197.     else if (editor == ED_MEM)
  198.         mem_max = 0x10000;
  199.     //-------------------------------------------------------------------------
  200.     else if (editor == ED_CMOS)
  201.         mem_max = sizeof(cmos);
  202.     //-------------------------------------------------------------------------
  203.     else if (editor == ED_NVRAM)
  204.         mem_max = sizeof(nvram);
  205.     //-------------------------------------------------------------------------
  206.     else if (editor == ED_COMP_PAL)
  207.         mem_max = sizeof(comp.comp_pal);
  208.     //-------------------------------------------------------------------------
  209.     unsigned div;
  210.     div = mem_dump  ?   32      :
  211.                         8       ;
  212.     unsigned dx;
  213.     dx = (mem_max + div - 1) / div;
  214.     unsigned mem_lines;
  215.     mem_lines = min(dx, unsigned(mem_size));
  216.    
  217. redraw:
  218.  
  219.     cpu.mem_curs = memadr(cpu.mem_curs);
  220.     cpu.mem_top = memadr(cpu.mem_top);
  221.  
  222.     //-------------------------------------------------------------------------
  223.     for (ii = 0; ii < mem_lines; ii++)
  224.     {
  225.         //current addr
  226.         unsigned ptr = memadr( cpu.mem_top + ii * mem_sz);
  227. //      sprintf(        line,
  228. //                      "%04X ",
  229. //                      ptr
  230. //              );
  231.        
  232.         sprintf(        value,          //NS
  233.                         "%04X",
  234.                         ptr
  235.                 );
  236.                
  237.         int attr_values_1 = attr_values;
  238.         // ROM костылем
  239.         if (bankr[ (ptr >> 14) & 3] != bankw[ (ptr >> 14) & 3])
  240.         {
  241.             attr_values_1 &= 0xF7;
  242.         }
  243.                    
  244.         tprint(         mem_x,          //NS
  245.                         mem_y+ii,
  246.                         value,
  247.                         (       ((cpu.mem_addr_edit_mode == 1)  &&
  248.                                 (activedbg == WNDMEM)           &&
  249.                                 (cpu.mem_curs == ptr))    ?     DBG_ATTR_MEM_SELECTED :
  250.                                                                 attr_values_1 )
  251.                 );
  252.         tprint(         mem_x+4,        //NS
  253.                         mem_y+ii,
  254.                         " ",
  255.                         attr_values
  256.                 );
  257.                
  258.         unsigned cx = 0;
  259.        
  260. #define FLAG_PC         0x01
  261. #define FLAG_BP_X       0x02
  262. #define FLAG_BP_R       0x04
  263. #define FLAG_BP_W       0x08
  264.  
  265.  
  266.  
  267.         // сбрасываемые каждую строку переменные      // DF 58<5A>F6 C7 A5 17 40
  268.         // для маркера типа бряка вокруг hex значения         
  269.         // для лучшей видимости типа бряка
  270.         //
  271.         // тип бряка R/W/RW
  272.         int old_break_mark = 0;
  273.         int new_break_mark = 0;
  274.         // тк ink в след раз может использоваться как paper
  275.         int old_break_mark_attr = current_back_attr | (current_back_attr >> 4);
  276.         int new_break_mark_attr = current_back_attr | (current_back_attr >> 4);
  277.         // выходные атрибуты для маркера бряка
  278.         int break_mark_1_attr = current_back_attr;
  279.         int break_mark_2_attr = current_back_attr;
  280.         // изображение бряка
  281.         char break_mark_1[2] = " ";     // ' ' / '>'
  282.         char break_mark_2[2] = " ";     // ' ' / '<'
  283.        
  284.         //---------------------------------------------------------------------
  285.         if (mem_dump)
  286.         {  // 0000 0123456789ABCDEF0123456789ABCDEF
  287.             for (unsigned dx = 0;    dx < 32;    dx++)
  288.             {
  289.                         //подсветка бряков и PC и курсора               //NS
  290.                         unsigned char res = cpu.membits[ ptr];         
  291.                         unsigned char mem_color = attr_values;
  292.                         if (editor == ED_MEM)
  293.                         {
  294.                             if          (ptr == cpu.pc)         mem_color = (current_back_attr | 0x0D); //5
  295.                             else if     (ptr == cpu.trace_curs) mem_color = (current_back_attr | 0x0E); //6
  296.                             else if     (res & MEMBITS_BPX)     mem_color = (current_back_attr | 0x0A); //2
  297.                             else if     (res & MEMBITS_BPR)     mem_color = (current_back_attr | 0x0C); //4
  298.                             else if     (res & MEMBITS_BPW)     mem_color = (current_back_attr | 0x0B); //3
  299.                             else if     (bankr[ (ptr >> 14) & 3] != bankw[ (ptr >> 14) & 3])
  300.                                                                 mem_color = (current_back_attr | 0x07); //7 ROM
  301.                            
  302.                            
  303.                         }
  304.                 if (ptr == cpu.mem_curs)
  305.                 {
  306.                     cx = dx + 5;
  307.                 }
  308.                 unsigned char c = editrm( ptr);
  309.                 ptr = memadr( ptr + 1);
  310.                 //line[dx+5] = char(c ? c : '.' );
  311.                                        
  312.                         *char_1 = char( c ? c : '.' );
  313.                         tprint(         (mem_x + dx + 5),       // [NS]
  314.                                         mem_y+ii,
  315.                                         char_1,
  316.                                         mem_color       //attr_values
  317.                                 );
  318.                                
  319.             }
  320.         } // тип 0000 0123456789ABCDEF0123456789ABCDEF
  321.         //---------------------------------------------------------------------
  322.         else
  323.         {  // 0000 11 22 33 44 55 66 77 88 abcdefgh
  324.             for (unsigned dx = 0;    dx < 8;    dx++)
  325.             {
  326.                 //подсветка бряков и PC и курсора               // [NS]
  327.                 unsigned char res = cpu.membits[ ptr];;        
  328.                 unsigned char attr1 = attr_values;
  329.  
  330.                 *break_mark_1 = ' ';    //nope / >
  331.                 *break_mark_2 = ' ';    //nope / <
  332.                    
  333.                 // редактор CPU memory
  334.                 if (editor == ED_MEM)
  335.                 {
  336.                     int temp_line_flags = 0;
  337.                     old_break_mark = new_break_mark;
  338.                     old_break_mark_attr = new_break_mark_attr;
  339.                    
  340.                     new_break_mark = 0;
  341.                        
  342.                     //-------------------------------------------------
  343.                     // сборка флагов для выбора цвета и типа маркера
  344.                     if (res & MEMBITS_BPX) { temp_line_flags |= FLAG_BP_X; }    //NO! new_break_mark
  345.                     if (res & MEMBITS_BPR) { temp_line_flags |= FLAG_BP_R;      new_break_mark |= FLAG_BP_R; }
  346.                     if (res & MEMBITS_BPW) { temp_line_flags |= FLAG_BP_W;      new_break_mark |= FLAG_BP_W; } 
  347.                     //-------------------------------------------------
  348.                     // выбор атрибута для текущего значения
  349.                     // и атрибута для маркера типа бряка
  350.                     switch (temp_line_flags)
  351.                     {
  352.                         //X only --------------------------------------
  353.                         case (FLAG_BP_X):                               //...O
  354.                             attr1 = (attr1 & 0xF0) | DBG_ATTR_MEM_BREAK_EX;    
  355.                             break;      //+ back
  356.                         //RW ------------------------------------------
  357.                         case (FLAG_BP_R):                               //..O.
  358.                             attr1 = (attr1 & 0x0F) | DBG_ATTR_MEM_BREAK_R_BACK; //+ ink
  359.                             new_break_mark_attr = current_back_attr | DBG_ATTR_MEM_BREAK_R;
  360.                             break;     
  361.                         case (FLAG_BP_W):                               //.O..
  362.                             attr1 = (attr1 & 0x0F) | DBG_ATTR_MEM_BREAK_W_BACK; //+ ink
  363.                             new_break_mark_attr = current_back_attr | DBG_ATTR_MEM_BREAK_W;
  364.                             break;     
  365.                         case (FLAG_BP_R | FLAG_BP_W):           //.OO.
  366.                             attr1 = (attr1 & 0x0F) | DBG_ATTR_MEM_BREAK_RW_BACK;        //+ ink
  367.                             new_break_mark_attr = current_back_attr | DBG_ATTR_MEM_BREAK_RW;
  368.                             break;     
  369.                         //RW + X --------------------------------------
  370.                         case (FLAG_BP_X | FLAG_BP_R):           //..OO
  371.                             attr1 = DBG_ATTR_MEM_BREAK_EX | DBG_ATTR_MEM_BREAK_R_BACK;
  372.                             new_break_mark_attr = current_back_attr | DBG_ATTR_MEM_BREAK_R;
  373.                             break;     
  374.                         case (FLAG_BP_X | FLAG_BP_W):           //.O.O
  375.                             attr1 = DBG_ATTR_MEM_BREAK_EX | DBG_ATTR_MEM_BREAK_W_BACK;
  376.                             new_break_mark_attr = current_back_attr | DBG_ATTR_MEM_BREAK_W;
  377.                     break;     
  378.                         case (FLAG_BP_X | FLAG_BP_R | FLAG_BP_W):       //.OOO
  379.                             attr1 = DBG_ATTR_MEM_BREAK_EX | DBG_ATTR_MEM_BREAK_RW_BACK;
  380.                             new_break_mark_attr = current_back_attr | DBG_ATTR_MEM_BREAK_RW;
  381.                             break;
  382.                         default:
  383.                             new_break_mark_attr = current_back_attr | (current_back_attr >> 4);
  384.                     }
  385.                     //-------------------------------------------------
  386.                     // атрибуты для курсора и PC
  387.                     if (ptr == cpu.trace_curs)  attr1 = (attr1 & 0XF0) | DBG_ATTR_MEM_TRACE_CURSOR;
  388.                     if (ptr == cpu.pc)          attr1 = (attr1 & 0XF0) | DBG_ATTR_MEM_REG_PC;
  389.                     //-------------------------------------------------
  390.                     // ROM костылем
  391.                     if ( (bankr[ (ptr >> 14) & 3] != bankw[ (ptr >> 14) & 3]) &&
  392.                          ((attr1 & 0X0F) == 0x0F)
  393.                      )
  394.                     {
  395.                         attr1 &= 0xF7;
  396.                     }
  397.                     //-------------------------------------------------
  398.                     // разные изображения для единичного и серии маркеров
  399.                     // и разные атрибуты для них
  400.                     //
  401.                     if (new_break_mark) //начало нового типа маркера
  402.                     {
  403.                         if (old_break_mark != new_break_mark)
  404.                         {
  405.                             //new mode
  406.                             *break_mark_1 = 0x11;       //      '<';   
  407.                             *break_mark_2 = 0x10;       //      '>';
  408.                             //paper = предыдущий ink
  409.                             break_mark_1_attr =  (0x0F & new_break_mark_attr) |
  410.                                                 ((0x0F & old_break_mark_attr) << 4);
  411.                         }
  412.                         else
  413.                         {
  414.                             //previous mode
  415.                             *break_mark_1 = 0xDB;       //      'O';   
  416.                             *break_mark_2 = 0x10;       //      '>';
  417.                             break_mark_1_attr = new_break_mark_attr;
  418.                         }
  419.                        
  420.                         break_mark_2_attr = new_break_mark_attr;
  421.                     }
  422.                     else                //конец маркера или его отсутствие
  423.                     {
  424.                         if (old_break_mark)
  425.                         {
  426.                             //previous mode ends
  427.                             *break_mark_1 = 0x10;       //      '>';   
  428.                             *break_mark_2 = 0x20;       //      ' ';
  429.                         }
  430.                         else
  431.                         {
  432.                             //nope
  433.                             *break_mark_1 = 0x20;       //      ' ';   
  434.                             *break_mark_2 = 0x20;       //      ' ';
  435.                         }
  436.                                
  437.                                 break_mark_1_attr = old_break_mark_attr;
  438.                                 break_mark_2_attr = old_break_mark_attr;
  439.                     }
  440.                     //-------------------------------------------------
  441.  
  442.                 // MEMBITS_R | MEMBITS_W | MEMBITS_X флаги не ставятсо в режиме дебагера
  443.                 // (хотя возможно они ставятсо при выходе из дебагера и сразу все или раз в фрейм)
  444.                 // (или как то перекидываютсо из другого масива)
  445.                 // а включенный меморри бенд еще и затирает их постоянно
  446.                 // так что нужно больше костылей
  447.                        
  448.                 } //(editor == ED_MEM)
  449.                 //-----------------------------------------------------        
  450.  
  451.                        
  452.                 //-----------------------------------------------------
  453.                 // отрисовка
  454.                
  455.                 if (ptr == cpu.mem_curs)
  456.                 {
  457.                     cx = (mem_ascii) ?  dx + 29                         :
  458.                                         dx * 3 + 5 + cpu.mem_second     ;
  459.                 }
  460.                 unsigned char c = editrm(ptr);
  461.                 ptr = memadr(ptr+1);
  462.         //      sprintf(        line + 5 + (3*dx),
  463.         //                      "%02X",c
  464.         //              );
  465.         //      line[7+3*dx] = ' ';                             //:rofl:
  466.         //      line[29+dx] = char(     c   ?   c       :
  467.         //                                      '.'     );
  468.                
  469.                 //-------------------------------------------------------------
  470.                 // hex
  471.                 sprintf(        value,                          // [NS]
  472.                                 "%02X",c
  473.                         );
  474.                 tprint(         (mem_x + 5 + (3 * dx)),         // [NS]
  475.                                 mem_y + ii,
  476.                                 value,
  477.                                 attr1   //mem_color     //attr_values
  478.                         );
  479.                 //-------------------------------------------------------------
  480.                 // маркеры типа бряка
  481.                 tprint(         (mem_x + 4 + (3*dx)),           //NS
  482.                                 mem_y+ii,
  483.                                 break_mark_1,   //" ","<"
  484.                                 break_mark_1_attr       //attr_values
  485.                         );                     
  486.                 tprint(         (mem_x + 7 + (3*dx)),           //NS
  487.                                 mem_y+ii,
  488.                                 break_mark_2,   //" ","<"
  489.                                 break_mark_2_attr       //attr_values
  490.                         );
  491.                 //-----------------------------------------------------
  492.                 //ascii превиев в конце
  493.                 *char_1 = char( c   ?   c       :       //замена 0 пустоты на видимый '.'
  494.                                         '.'     );
  495.                 tprint(         (mem_x + 29+dx),                //NS
  496.                                 mem_y+ii,
  497.                                 char_1,
  498.                                 attr1   //attr_values
  499.                         );
  500.                 //-----------------------------------------------------
  501.                                                
  502.             }
  503.         } // тип 0000 11 22 33 44 55 66 77 88 abcdefgh
  504.         //---------------------------------------------------------------------
  505.        
  506.        
  507.         //---------------------------------------------------------------------
  508.         line[37] = 0;
  509.        
  510.         // отрисовка сразу всей, блджд, строки
  511. //      tprint(         mem_x,
  512. //                      mem_y+ii,
  513. //                      line,
  514. //                      (activedbg == WNDMEM) ? W_SEL   :
  515. //                                              W_NORM
  516. //              );
  517.         //---------------------------------------------------------------------
  518.         // разукрашка курсора
  519.         cursor_found |= cx;
  520.  
  521.         if (    cx                      &&
  522.                 (activedbg == WNDMEM)   &&
  523.                 (!cpu.mem_addr_edit_mode)
  524.           )
  525.         {
  526.             txtscr[ ((mem_y + ii) * s80) + mem_x + cx + (s80 * s30) ] = DBG_ATTR_MEM_SELECTED;  //W_CURS;
  527.         }    
  528.     }
  529.     //-------------------------------------------------------------------------
  530.  
  531.     //слежение за курсором улетающим вверх
  532.     if (!cursor_found) {        cursor_found = 1;
  533.                                 cpu.mem_top = cpu.mem_curs & ~(mem_sz-1);
  534.                                 goto redraw;
  535.                         }
  536.     //-------------------------------------------------------------------------
  537.  
  538. title:
  539.     const char *MemName = nullptr;
  540.     //-------------------------------------------------------------------------
  541.     if (editor == ED_MEM)
  542.     {
  543.         //---------------------------------------------------------------------
  544.         //MemName = "Memory";
  545.         if ( (CpuMgr.GetCurrentCpu()) == 0 )    // [NS]
  546.         {
  547.             MemName = "ZX-CPU"; //"ZX-Z80";     //"ZX_CPU";
  548.         }
  549.         //---------------------------------------------------------------------
  550.         else
  551.         {
  552.             MemName = "GS-CPU"; //"GS-Z80";     //"GS_CPU";
  553.         }
  554.         //---------------------------------------------------------------------
  555.     }
  556.     //-------------------------------------------------------------------------
  557.     else if (editor == ED_CMOS)
  558.         MemName = "CMOS";
  559.     //-------------------------------------------------------------------------
  560.     else if (editor == ED_NVRAM)
  561.         MemName = "NVRAM";
  562.     //-------------------------------------------------------------------------
  563.     else if(editor == ED_COMP_PAL)
  564.         MemName = "CompPal";
  565.     //-------------------------------------------------------------------------
  566.  
  567.     //-------------------------------------------------------------------------
  568.     if (        editor == ED_MEM        ||
  569.                 editor == ED_CMOS       ||
  570.                 editor == ED_NVRAM      ||
  571.                 editor == ED_COMP_PAL
  572.       )
  573.     {
  574.         sprintf(        line,
  575.                         "%s: %04X    NGS_DMA: %06X",
  576.                         MemName,
  577.                         cpu.mem_curs & 0xFFFF,
  578.                         temp.gsdmaaddr
  579.                 );
  580.     }
  581.     //-------------------------------------------------------------------------
  582.     else if (editor == ED_PHYS)
  583.         sprintf(        line,
  584.                         "Disk %c, Trk %02X, Offs %04X",
  585.                         int(mem_disk+'A'),
  586.                         mem_track,
  587.                         cpu.mem_curs
  588.                 );
  589.     //-------------------------------------------------------------------------
  590.     else                // ED_LOG
  591.     {
  592.         if (mem_max)
  593.             findsector(cpu.mem_curs);
  594.            
  595.         sprintf(        line,
  596.                         "Disk %c, Trk %02X, Sec %02X[%02X], Offs %04X",
  597.                         int(mem_disk+'A'),
  598.                         mem_track,
  599.                         sector,
  600.                         edited_track.hdr[sector].n,
  601.                         cpu.mem_curs-sector_offset
  602.                 );
  603.     }
  604.     //-------------------------------------------------------------------------
  605.     tprint(     mem_x,
  606.                 mem_y-1,
  607.                 line,
  608.                 DBG_ATTR_MEM_DUMP_TYPE  //W_TITLE
  609.            );
  610.     //-------------------------------------------------------------------------
  611.     frame(      mem_x,
  612.                 mem_y,
  613.                 37,
  614.                 mem_size,
  615.                 FRAME
  616.          );
  617.     //-------------------------------------------------------------------------
  618. }
  619. //=============================================================================
  620.  
  621.  
  622.       /* ------------------------------------------------------------- */
  623.  
  624.  
  625. //=============================================================================
  626. // start of line
  627. void mstl()                                             //"mem.stline" хоткей
  628. {
  629.     Z80 &cpu = CpuMgr.Cpu();
  630.     if (mem_max)
  631.     {
  632.         cpu.mem_curs &= ~(mem_sz - 1);
  633.         cpu.mem_second = 0;
  634.     }
  635. }
  636. //=============================================================================
  637. // end of line                                          //"mem.endline" хоткей
  638. void mendl()                                           
  639. {
  640.     Z80 &cpu = CpuMgr.Cpu();
  641.     if(mem_max)
  642.     {
  643.         cpu.mem_curs |= (mem_sz - 1);
  644.         cpu.mem_second = 1;
  645.     }
  646. }
  647. //=============================================================================
  648. void mup()                                              //"mem.up" хоткей
  649. {
  650.     Z80 &cpu = CpuMgr.Cpu();
  651.  
  652.         if (mem_max) cpu.mem_curs -= mem_sz;    
  653. }
  654. //=============================================================================
  655. void mpgdn()                                            //"mem.pgdn" хоткей
  656. {
  657.     Z80 &cpu = CpuMgr.Cpu();
  658.     if (mem_max)
  659.     {
  660.         cpu.mem_curs += mem_size * mem_sz;
  661.         cpu.mem_top += mem_size * mem_sz;
  662.     }
  663. }
  664. //=============================================================================
  665. void mpgup()                                            // "mem.pgup" хоткей
  666. {
  667.     Z80 &cpu = CpuMgr.Cpu();
  668.     if (mem_max)
  669.     {
  670.         cpu.mem_curs -= mem_size * mem_sz;
  671.         cpu.mem_top -= mem_size * mem_sz;
  672.     }
  673. }
  674. //=============================================================================
  675. void mdown()                                            // "mem.down" хоткей
  676. {
  677.     if (!mem_max) return;
  678.  
  679.     Z80 &cpu = CpuMgr.Cpu();
  680.         //dump
  681.         cpu.mem_curs += mem_sz;
  682.         if (((cpu.mem_curs - cpu.mem_top + mem_max) % mem_max) / mem_sz >= mem_size) cpu.mem_top += mem_sz;
  683. }
  684. //=============================================================================
  685. void mleft()                                            // "mem.left" хоткей
  686. {
  687.     if (!mem_max) return;
  688.    
  689.     if (!cpu.mem_addr_edit_mode)
  690.     {
  691.         Z80 &cpu = CpuMgr.Cpu();
  692.         if (mem_ascii || !cpu.mem_second) cpu.mem_curs--;
  693.         if (!mem_ascii) cpu.mem_second ^= 1;
  694.     }
  695. }
  696. //=============================================================================
  697. void mright()                                           // "mem.right" хоткей
  698. {
  699.    Z80 &cpu = CpuMgr.Cpu();
  700.    if (!mem_max) return;
  701.    
  702.     if (!cpu.mem_addr_edit_mode)
  703.     {
  704.         if (mem_ascii || cpu.mem_second) cpu.mem_curs++;
  705.         if (!mem_ascii) cpu.mem_second ^= 1;
  706.         if (((cpu.mem_curs - cpu.mem_top + mem_max) % mem_max) / mem_sz >= mem_size) cpu.mem_top += mem_sz;
  707.     }
  708.     else
  709.     {
  710.         cpu.mem_addr_edit_mode = 0;
  711.         cpu.mem_second = 0;
  712.     }
  713. }
  714. //=============================================================================
  715.  
  716.  
  717. // mem_max - размер всей памяти (для 0...FFFF = 10000)
  718. // mem_sz - размер строки
  719. // cpu.mem_top - адрес начала самой верхней видимой строки
  720. // cpu.mem_curs - адрес курсора
  721.  
  722. //=============================================================================
  723. // по аналогии с center()
  724. void menter()   // edit addr pos        "mem.addr_edit" хоткей            // [NS]
  725. {
  726.     //-------------------------------------------------------------------------
  727.     // работает только когда курсор над адресом?
  728.     if (cpu.mem_addr_edit_mode)
  729.     {
  730.         Z80 &cpu = CpuMgr.Cpu();
  731.         //---------------------------------------------------------------------
  732.         if (!mem_sz)    //на всякий случай защита от /0
  733.             return;
  734.         //---------------------------------------------------------------------
  735.         int y_coord;
  736.         //---------------------------------------------------------------------
  737.         if (cpu.mem_curs >= cpu.mem_top)
  738.         {
  739.             y_coord = (mem_y + ((cpu.mem_curs - cpu.mem_top) / mem_sz));
  740.         //                      (0030 - 0000) / 10 = 3
  741.         //                      0 0000 top
  742.         //                      1 0010
  743.         //                      2 0020
  744.         //                      3 0030 <- cursor
  745.         }
  746.         //---------------------------------------------------------------------
  747.         else
  748.         {
  749.             y_coord = (mem_y + ((cpu.mem_curs - (cpu.mem_top - mem_max)) / mem_sz));
  750.         //                      (0030 - (FFF0 - 10000)) / 10
  751.         //                      (0030 - (-10)) / 10 = 4
  752.         //                      0 FFF0 top
  753.         //                      1 0000
  754.         //                      2 0010
  755.         //                      3 0020
  756.         //                      4 0030 <- cursor
  757.         }
  758.         //---------------------------------------------------------------------
  759.         //тк возможны падения при неправильной координате то ограничение
  760.         if (y_coord < mem_y)            y_coord = mem_y;
  761.         //---------------------------------------------------------------------
  762.         if (y_coord > (mem_y + 11) )    y_coord = (mem_y + 11);
  763.         //---------------------------------------------------------------------
  764. //      printf("mem_y %d ",mem_y);
  765. //      printf("cpu.mem_curs %d ",cpu.mem_curs);
  766. //      printf("cpu.mem_top %d ",cpu.mem_top);
  767. //      printf("mem_sz %d ",mem_sz);   
  768. //      printf("y_coord %d ",y_coord);
  769. //      printf("mem_max %d ",mem_max);
  770.         //y_coord 536862737 !!! crash
  771.  
  772. //crsh03
  773. //mem_y 15
  774. //cpu.mem_curs 8
  775. //cpu.mem_top 65496
  776. //mem_sz 8
  777. //y_coord 536862741
  778.  
  779. //      int y_coord = (15 + ((8 - 65496) / 8)); = -8171
  780.        
  781. // mem_top может быть F000 когда курсор 0010 !!!!!!!!
  782.  
  783.         //---------------------------------------------------------------------
  784.         // если мы не зашли в режим редактирования по enter (нужно проверять menter hotkey !!!!!)
  785.         // значет мы зашли туда началом ввода
  786.         // и надо сразу ввести что мы вводли
  787.         if (input.lastkey != VK_RETURN)
  788.         {
  789.             // шляпа - ущербный ввод значения которым мы вошли в режим редактирования
  790.             PostThreadMessage(  GetCurrentThreadId(),   //????????
  791.                                 WM_KEYDOWN,
  792.                                 input.lastkey,
  793.                                 1
  794.                           );
  795.         }
  796.         //---------------------------------------------------------------------
  797.                          
  798.  
  799.         int v = input4( mem_x,
  800.                         y_coord,//mem_y,
  801.                         cpu.mem_curs
  802.                        );
  803.         //---------------------------------------------------------------------
  804.         if (v != -1)
  805.         {
  806.             cpu.mem_top = (unsigned(v) & ~(mem_sz - 1));
  807.             cpu.mem_curs = (unsigned(v) & ~(mem_sz - 1));       //unsigned(v);
  808.         }
  809.         //---------------------------------------------------------------------
  810.     }
  811.     //-------------------------------------------------------------------------
  812.  
  813. }
  814. //=============================================================================
  815.  
  816.  
  817. //=============================================================================
  818. char dispatch_mem()                             //правка в окне мемори виевера
  819. {
  820.    Z80 &cpu = CpuMgr.Cpu();
  821.    if (!mem_max)
  822.        return 0;
  823.  
  824.  
  825.     if (!cpu.mem_addr_edit_mode)
  826.     {
  827.         u8 Kbd[256];
  828.         GetKeyboardState(Kbd);
  829.         unsigned short k = 0;
  830.         if (ToAscii(input.lastkey,0,Kbd,&k,0) != 1)
  831.             return 0;
  832.  
  833.         if (mem_ascii)
  834.         {
  835.             k &= 0xFF;
  836.             if (k < 0x20 || k >= 0x80)
  837.                 return 0;
  838.             editwm(cpu.mem_curs, (unsigned char) k);
  839.             mright();
  840.             return 1;
  841.         }
  842.         else
  843.         {
  844.             u8 u = u8(toupper(k));
  845.             if ((u >= '0' && u <= '9') || (u >= 'A' && u <= 'F'))
  846.             {
  847.                 unsigned char k = (u >= 'A') ? u - 'A'+10 : u - '0';
  848.                 unsigned char c = editrm(cpu.mem_curs);
  849.                 if (cpu.mem_second)
  850.                     editwm(cpu.mem_curs, (c & 0xF0) | k);
  851.                 else
  852.                     editwm(cpu.mem_curs, u8(c & 0x0F) | u8(k << 4));
  853.                 mright();
  854.                 return 1;
  855.             }
  856.         }
  857.     } //if (!cpu.mem_addr_edit_mode)
  858.     else
  859.     {
  860.         if ((input.lastkey >= '0' && input.lastkey <= '9') || (input.lastkey >= 'A' && input.lastkey <= 'F'))
  861.         {
  862.             menter();      
  863.             return 1;
  864.         }
  865.     }
  866.    
  867.    return 0;
  868. }
  869. //=============================================================================
  870.  
  871.  
  872.  
  873.  
  874.  
  875. //=============================================================================
  876. // find text in memory / disk track                     // меню в WNDMEM окне
  877. void mtext()                                            // и "mem.findtext" хоткей
  878. {
  879.    Z80 &cpu = CpuMgr.Cpu();
  880.    int rs = find1dlg(cpu.mem_curs);
  881.    if (rs != -1) cpu.mem_curs = unsigned(rs);
  882. }
  883. //=============================================================================
  884. // find code with mask in memory / disk track
  885. void mcode()                                            // и "mem.findcode" хоткей
  886. {
  887.    Z80 &cpu = CpuMgr.Cpu();
  888.    int rs = find2dlg(cpu.mem_curs);
  889.    if (rs != -1) cpu.mem_curs = unsigned(rs);
  890. }
  891. //=============================================================================
  892.  
  893.  
  894. //=============================================================================
  895. // goto address                                         // меню в WNDMEM окне
  896. void mgoto()                                            // и "mem.goto" хоткей
  897. {
  898.    Z80 &cpu = CpuMgr.Cpu();
  899.    int v = input4(mem_x, mem_y, cpu.mem_top);
  900.    if(v != -1)
  901.    {
  902.        cpu.mem_top = (unsigned(v) & ~(mem_sz - 1));
  903.        cpu.mem_curs = unsigned(v);
  904.    }
  905. }
  906. //=============================================================================
  907. // move to hex/ascii                                    // "mem.switch" хоткей
  908. // переход мехду столбцемм hex и ascii (щас не актуален)
  909. void mswitch() { mem_ascii ^= 1; }                     
  910. //=============================================================================
  911. // goto SP в окне мемори виевира                      // меню в WNDMEM окне
  912. void msp()                                              // и "mem.sp" хоткей
  913. {
  914.     Z80 &cpu = CpuMgr.Cpu();
  915.     cpu.mem_curs = cpu.sp;
  916. }
  917. //=============================================================================
  918. // goto PC в окне мемори виевира
  919. void mpc()                                              // и "mem.pc" хоткей
  920. {
  921.     Z80 &cpu = CpuMgr.Cpu();
  922.     cpu.mem_curs = cpu.pc;
  923. }
  924. //=============================================================================
  925. // goto BC в окне мемори виевира
  926. void mbc()                                              // "mem.bc" хоткей
  927. {
  928.     Z80 &cpu = CpuMgr.Cpu();
  929.     cpu.mem_curs = cpu.bc;
  930. }
  931. //=============================================================================
  932. // goto DE в окне мемори виевира
  933. void mde()                                              // "mem.de" хоткей
  934. {
  935.     Z80 &cpu = CpuMgr.Cpu();
  936.     cpu.mem_curs = cpu.de;
  937. }
  938. //=============================================================================
  939. // goto HL (в окне мемори виевира)
  940. void mhl()                                              // "mem.hl" хоткей
  941. {
  942.     Z80 &cpu = CpuMgr.Cpu();
  943.     cpu.mem_curs = cpu.hl;
  944. }
  945. //=============================================================================
  946. // goto IX (в окне мемори виевира)
  947. void mix()                                              // "mem.ix" хоткей
  948. {
  949.     Z80 &cpu = CpuMgr.Cpu();
  950.     cpu.mem_curs = cpu.ix;
  951. }
  952. //=============================================================================
  953. // goto IY (в окне мемори виевира)
  954. void miy()                                              // "mem.iy" хоткей
  955. {
  956.     Z80 &cpu = CpuMgr.Cpu();
  957.     cpu.mem_curs = cpu.iy;
  958. }
  959. //=============================================================================
  960. // select memory editor
  961. void mmodemem() { editor = ED_MEM; }                    // "mem.mem" хоткей
  962. //=============================================================================
  963. // select disk editor (physical track)
  964. void mmodephys() { editor = ED_PHYS; }                  // "mem.diskphys" хоткей
  965. //=============================================================================
  966. // select disk editor (logical sectors)
  967. void mmodelog() { editor = ED_LOG; }                    // "mem.disklog" хоткей
  968. //=============================================================================
  969. // select drive/track/sector in diskeditor
  970. void mdiskgo()                                          // "mem.diskgo" хоткей
  971. {
  972.    Z80 &cpu = CpuMgr.Cpu();
  973.    if (editor == ED_MEM) return;
  974.    //дописать еще !!!!!
  975.    // точнее режиммы ппри каких работать
  976.    // а не ппри кааких выходитть !!!
  977.  
  978. // bug !!!!!  
  979. // "mem.diskgo" хоткей сррабатывает во всех режимах меморриввиевераа крроме мем
  980. // в тех которых трижды не должен !!!!
  981.  
  982.    for (;;) {
  983.       *(unsigned*)str = mem_disk + 'A';
  984.       if (!inputhex(mem_x+5, mem_y-1, 1, true)) return;
  985.       if (*str >= 'A' && *str <= 'D') break;
  986.    }
  987.    mem_disk = unsigned(*str-'A'); showmem();
  988.    int x = input2(mem_x+12, mem_y-1, mem_track);
  989.    if (x == -1) return;
  990.    mem_track = unsigned(x);
  991.    if (editor == ED_PHYS) return;
  992.    showmem();
  993.    // enter sector
  994.    for (;;) {
  995.       findsector(cpu.mem_curs); x = input2(mem_x+20, mem_y-1, sector);
  996.       if (x == -1) return; if (unsigned(x) < edited_track.s) break;
  997.    }
  998.    for (cpu.mem_curs = 0; x; x--) cpu.mem_curs += edited_track.hdr[x-1].datlen;
  999. }
  1000. //=============================================================================
  1001.  
  1002. //=============================================================================
  1003. // set breakpoint                               // в меню WNDTRACE дебагера
  1004. void mbpx()                                     // [NS]
  1005. {                      
  1006.     Z80 &cpu = CpuMgr.Cpu();
  1007.     cpu.membits[ cpu.mem_curs] ^= MEMBITS_BPX;
  1008. }
  1009. //=============================================================================v
  1010. void mbpr()                                     // в меню WNDTRACE дебагера
  1011. {                                               // [NS]
  1012.     Z80 &cpu = CpuMgr.Cpu();                   
  1013.     cpu.membits[ cpu.mem_curs] ^= MEMBITS_BPR;
  1014. }
  1015. //=============================================================================
  1016. void mbpw()                                     // в меню WNDTRACE дебагера
  1017. {                                               // [NS]
  1018.     Z80 &cpu = CpuMgr.Cpu();                   
  1019.     cpu.membits[cpu.mem_curs] ^= MEMBITS_BPW;
  1020. }
  1021. //=============================================================================
  1022.