Subversion Repositories pentevo

Rev

Rev 796 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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 "util.h"
  11.  
  12. namespace z80dbg
  13. {
  14. __int64 __cdecl delta();
  15. __int64 __cdecl delta()
  16. {
  17.     return comp.t_states + cpu.t - cpu.debug_last_t;
  18. }
  19. }
  20.  
  21. void show_time()
  22. {
  23.    Z80 &cpu = CpuMgr.Cpu();
  24.    tprint(time_x, time_y, "time delta:", W_OTHEROFF);
  25.    char text[32];
  26.    sprintf(text, "%14I64d", cpu.Delta());
  27.    tprint(time_x+11, time_y, text, W_OTHER);
  28.    tprint(time_x+25, time_y, "t", W_OTHEROFF);
  29.    frame(time_x, time_y, 26, 1, FRAME);
  30. }
  31.  
  32. static void wtline(const char *name, unsigned ptr, unsigned y)
  33. {
  34.    char line[40];
  35.    if(name)
  36.        sprintf(line, "%3s: ", name);
  37.    else
  38.        sprintf(line, "%04X ", ptr);
  39.  
  40.    Z80 &cpu = CpuMgr.Cpu();
  41.    for (unsigned dx = 0; dx < 8; dx++)
  42.    {
  43.       unsigned char c = cpu.DirectRm(ptr++);
  44.       sprintf(line+5+3*dx, "%02X", c);
  45.       line[7+3*dx] = ' ';
  46.       line[29+dx] = char(c ? c : '.');
  47.    }
  48.  
  49.    line[37] = 0;
  50.    tprint(wat_x, wat_y+y, line, W_OTHER);
  51. }
  52.  
  53. void showwatch()
  54. {
  55.    if (show_scrshot)
  56.    {
  57.       for (unsigned y = 0; y < wat_sz; y++)
  58.          for (unsigned x = 0; x < 37; x++)
  59.             txtscr[80*30 +  (wat_y+y)*80 + (wat_x+x)] = 0xFF;
  60.    }
  61.    else
  62.    {
  63.       Z80 &cpu = CpuMgr.Cpu();
  64.       wtline("PC", cpu.pc, 0);
  65.       wtline("SP", cpu.sp, 1);
  66.       wtline("BC", cpu.bc, 2);
  67.       wtline("DE", cpu.de, 3);
  68.       wtline("HL", cpu.hl, 4);
  69.       wtline("IX", cpu.ix, 5);
  70.       wtline("IY", cpu.iy, 6);
  71.       wtline("BC'", cpu.alt.bc, 7);
  72.       wtline("DE'", cpu.alt.de, 8);
  73.       wtline("HL'", cpu.alt.hl, 9);
  74.       wtline(nullptr, user_watches[0], 10);
  75.       wtline(nullptr, user_watches[1], 11);
  76.       wtline(nullptr, user_watches[2], 12);
  77.    }
  78.    const char *text = "watches";
  79.    if (show_scrshot == 1) text = "screen memory";
  80.    if (show_scrshot == 2) text = "ray-painted";
  81.    tprint(wat_x, wat_y-1, text, W_TITLE);
  82.    if(comp.flags & CF_DOSPORTS)
  83.        tprint(wat_x+34, wat_y-1, "DOS", W_DOS);
  84.    frame(wat_x,wat_y,37,wat_sz,FRAME);
  85. }
  86.  
  87. void mon_setwatch()
  88. {
  89.    if (show_scrshot) show_scrshot = 0;
  90.    for (unsigned i = 0; i < 3; i++) {
  91.       debugscr();
  92.       int addr = input4(wat_x, wat_y+wat_sz-3+i, user_watches[i]);
  93.       if (addr == -1) return;
  94.       user_watches[i] = unsigned(addr);
  95.    }
  96. }
  97.  
  98. void showstack()
  99. {
  100.    Z80 &cpu = CpuMgr.Cpu();
  101.    for (unsigned i = 0; i < stack_size; i++)
  102.    {
  103.       char xx[10]; //-2:1234
  104.                    //SP:1234
  105.                    //+2:
  106.       if (!i) *(unsigned*)xx = WORD2('-','2');
  107.       else if (i==1) *(unsigned*)xx = WORD2('S','P');
  108.       else sprintf(xx, (i > 8) ? "%X" : "+%X", (i-1)*2);
  109.       sprintf(xx+2, ":%02X%02X", cpu.DirectRm(cpu.sp+(i-1)*2+1), cpu.DirectRm(cpu.sp+(i-1)*2));
  110.       tprint(stack_x, stack_y+i, xx, W_OTHER);
  111.    }
  112.    tprint(stack_x, stack_y-1, "stack", W_TITLE);
  113.    frame(stack_x, stack_y, 7, stack_size, FRAME);
  114. }
  115.  
  116. void show_ay()
  117. {
  118.    if (!conf.sound.ay_scheme) return;
  119.    const char *ayn = comp.active_ay ? "AY1" : "AY0";
  120.    if(conf.sound.ay_scheme < AY_SCHEME_QUADRO)
  121.    {
  122.        ayn = "AY:";
  123.        comp.active_ay = 0;
  124.    }
  125.    tprint(ay_x-3, ay_y, ayn, W_TITLE);
  126.    SNDCHIP *chip = &ay[comp.active_ay];
  127.    char line[32];
  128.    for (unsigned i = 0; i < 16; i++) {
  129.       line[0] = "0123456789ABCDEF"[i]; line[1] = 0;
  130.       tprint(ay_x + i*3, ay_y, line, W_AYNUM);
  131.       sprintf(line, "%02X", chip->get_reg(i));
  132.       tprint(unsigned(ay_x + i*3 + 1), unsigned(ay_y), line, i == (chip->get_activereg()) ? W_AYON : W_AYOFF);
  133.    }
  134.    frame(ay_x, ay_y, 48, 1, FRAME);
  135. }
  136.  
  137. void mon_switchay()
  138. {
  139.    comp.active_ay ^= 1;
  140. }
  141.  
  142. void __cdecl BankNames(int i, char *Name)
  143. {
  144.     unsigned rom_bank;
  145.     unsigned ram_bank;
  146.  
  147.     bool IsRam = (RAM_BASE_M <= bankr[i]) && (bankr[i] < RAM_BASE_M + PAGE * MAX_RAM_PAGES);
  148.     bool IsRom = (ROM_BASE_M <= bankr[i]) && (bankr[i] < ROM_BASE_M + PAGE * MAX_ROM_PAGES);
  149.  
  150.     if(IsRam)
  151.         ram_bank = ULONG((bankr[i] - RAM_BASE_M)/PAGE);
  152.  
  153.     if(IsRom)
  154.         rom_bank = ULONG((bankr[i] - ROM_BASE_M)/PAGE);
  155.  
  156.     if (IsRam)
  157.         sprintf(Name, "RAM%2X", ram_bank);
  158.  
  159.     if (IsRom)
  160.         sprintf(Name, "ROM%2X", rom_bank);
  161.  
  162.     if (bankr[i] == base_sos_rom)
  163.         strcpy(Name, "BASIC");
  164.     if (bankr[i] == base_dos_rom)
  165.         strcpy(Name, "TRDOS");
  166.     if (bankr[i] == base_128_rom)
  167.         strcpy(Name, "B128K");
  168.     if (bankr[i] == base_sys_rom && (conf.mem_model == MM_PROFSCORP || conf.mem_model == MM_SCORP))
  169.         strcpy(Name, "SVM  ");
  170.     if ((conf.mem_model == MM_PROFSCORP || conf.mem_model == MM_SCORP) && IsRom && rom_bank > 3)
  171.         sprintf(Name, "ROM%2X", rom_bank);
  172.  
  173.     if (bankr[i] == CACHE_M)
  174.         strcpy(Name, (conf.cache!=32)?"CACHE":"CACH0");
  175.     if (bankr[i] == CACHE_M+PAGE)
  176.         strcpy(Name, "CACH1");
  177. }
  178.  
  179. void showbanks()
  180. {
  181.    Z80 &cpu = CpuMgr.Cpu();
  182.    for (int i = 0; i < 4; i++)
  183.    {
  184.       char ln[64]; sprintf(ln, "%d:", i);
  185.       tprint(unsigned(banks_x), unsigned(banks_y+i+1), ln, W_OTHEROFF);
  186.       strcpy(ln, "?????");
  187.       cpu.BankNames(i, ln);
  188.       tprint(unsigned(banks_x+2), unsigned(banks_y+i+1), ln, bankr[i]!=bankw[i] ? W_BANKRO : W_BANK);
  189.    }
  190.    frame(banks_x, banks_y+1, 7, 4, FRAME);
  191.    tprint(banks_x, banks_y, "pages", W_TITLE);
  192. }
  193.  
  194. void showports()
  195. {
  196.    char ln[64];
  197.    sprintf(ln, "  FE:%02X", comp.pFE);
  198.    tprint(ports_x, ports_y, ln, W_OTHER);
  199.    sprintf(ln, "7FFD:%02X", comp.p7FFD);
  200.    tprint(ports_x, ports_y+1, ln, (comp.p7FFD & 0x20) &&
  201.    !((conf.mem_model == MM_PENTAGON && conf.ramsize == 1024) ||
  202.      (conf.mem_model == MM_PROFI && (comp.pDFFD & 0x10))) ? W_48K : W_OTHER);
  203.  
  204.    switch (conf.mem_model)
  205.    {
  206.       case MM_KAY:
  207.       case MM_SCORP:
  208.       case MM_PROFSCORP:
  209.       case MM_PLUS3:
  210.          dbg_extport = 0x1FFD; dbg_extval = comp.p1FFD;
  211.       break;
  212.       case MM_PROFI:
  213.          dbg_extport = 0xDFFD; dbg_extval = comp.pDFFD;
  214.       break;
  215.       case MM_ATM450:
  216.          dbg_extport = 0xFDFD; dbg_extval = comp.pFDFD;
  217.       break;
  218.       case MM_ATM710:
  219.       case MM_ATM3:
  220.          dbg_extport = (comp.aFF77 & 0xFFFF);
  221.          dbg_extval = comp.pFF77;
  222.       break;
  223.       case MM_QUORUM:
  224.          dbg_extport = 0x0000; dbg_extval = comp.p00;
  225.       break;
  226.       default:
  227.          dbg_extport = -1U;
  228.    }
  229.    if (dbg_extport != -1U)
  230.        sprintf(ln, "%04X:%02X", dbg_extport, dbg_extval);
  231.    else
  232.        sprintf(ln, "cmos:%02X", comp.cmos_addr);
  233.    tprint(ports_x, ports_y+2, ln, W_OTHER);
  234.  
  235.    sprintf(ln, "EFF7:%02X", comp.pEFF7);
  236.    tprint(ports_x, ports_y+3, ln, W_OTHER);
  237.    frame(ports_x, ports_y, 7, 4, FRAME);
  238.    tprint(ports_x, ports_y-1, "ports", W_TITLE);
  239. }
  240.  
  241. void showdos()
  242. {
  243. //    CD:802E
  244. //    STAT:24
  245. //    SECT:00
  246. //    T:00/01
  247. //    S:00/00
  248. //[vv]   if (conf.trdos_present) comp.wd.process();
  249.    char ln[64]; unsigned char atr = conf.trdos_present ? W_OTHER : W_OTHEROFF;
  250.    sprintf(ln, "CD:%02X%02X", comp.wd.cmd, comp.wd.data);
  251.    tprint(dos_x, dos_y, ln, atr);
  252.    sprintf(ln, "STAT:%02X", comp.wd.RdStatus());
  253.    tprint(dos_x, dos_y+1, ln, atr);
  254.    sprintf(ln, "SECT:%02X", comp.wd.sector);
  255.    tprint(dos_x, dos_y+2, ln, atr);
  256.    sprintf(ln, "T:%02X/%02X", comp.wd.seldrive->track, comp.wd.track);
  257.    tprint(dos_x, dos_y+3, ln, atr);
  258.    sprintf(ln, "S:%02X/%02X", comp.wd.system, comp.wd.rqs);
  259.    tprint(dos_x, dos_y+4, ln, atr);
  260.    frame(dos_x, dos_y, 7, 5, FRAME);
  261. #if 1
  262.    tprint(dos_x, dos_y-1, "beta128", W_TITLE);
  263. #else
  264.    sprintf(ln, "%X-%X %d", comp.wd.state, comp.wd.state2, comp.wd.seldrive->track);
  265.    tprint(dos_x,dos_y-1, ln, atr);
  266. #endif
  267. /*
  268. //    STAT:00101010
  269. //    CMD:80,STA:2A
  270. //    DAT:22,SYS:EE
  271. //    TRK:31,SEC:01
  272. //    DISK:A,SIDE:0
  273.  
  274.    char ln[64]; unsigned char atr = conf.trdos_present ? 0x20 : 0x27;
  275.    sprintf(ln, "STAT:00000000"); unsigned char stat = in_trdos(0x1F);
  276.    for (int i = 0; i < 7; i++) ln[i+5] = (stat & (0x80 >> i)) ? '1':'0';
  277.    tprint(dos_x, dos_y+1, ln, atr);
  278.    sprintf(ln, "CMD:%02X,STA:%02X", comp.trdos.cmd, stat);
  279.    tprint(dos_x, dos_y+2, ln, atr);
  280.    sprintf(ln, "DAT:%02X,SYS:%02X", comp.trdos.data, in_trdos(0xFF));
  281.    tprint(dos_x, dos_y+3, ln, atr);
  282.    sprintf(ln, "TRK:%02X,SEC:%02X", comp.trdos.track, comp.trdos.sector);
  283.    tprint(dos_x, dos_y+4, ln, atr);
  284.    sprintf(ln, "DISK:%c,SIDE:%c", 'A'+(comp.trdos.system & 3), (comp.trdos.system & 0x10) ? '0':'1');
  285.    tprint(dos_x, dos_y+5, ln, atr);
  286.    frame(dos_x, dos_y+1, 13, 5, FRAME);
  287.    tprint(dos_x, dos_y, "beta128", 0x83);
  288. */
  289. }
  290.  
  291. #ifdef MOD_GSBASS
  292. static INT_PTR CALLBACK gsdlg(HWND dlg, UINT msg, WPARAM wp, LPARAM lp)
  293. {
  294.     (void)lp;
  295.  
  296.     char tmp[0x200];
  297.     unsigned i; //Alone Coder 0.36.7
  298.     HWND lv = GetDlgItem(dlg, IDC_GSLIST);
  299.  
  300.     if(msg == WM_INITDIALOG)
  301.     {
  302.         ListView_SetExtendedListViewStyleEx(lv, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
  303.         LVCOLUMN Col = { };
  304.  
  305.         static const char *Cols[] = { "", "smp", "v", "n", "p", "f", "l" };
  306.         static const int Width[] = { 30, 100, 40, 40, 40, 70, 70 };
  307.  
  308.         Col.mask = LVCF_TEXT | LVCF_WIDTH;
  309.  
  310.         for(i = 0; i < _countof(Cols); i++)
  311.         {
  312.             Col.pszText = LPSTR(Cols[i]);
  313.             Col.cx = Width[i];
  314.             ListView_InsertColumn(lv, i, &Col);
  315.         }
  316.  
  317.         if(gs.modsize)
  318.         {
  319.             sprintf(tmp, "(%s)", gs.mod_playing ? "P" : "S");
  320.             LVITEM Item = { };
  321.             Item.mask = LVIF_TEXT;
  322.             Item.iItem = 0;
  323.             Item.iSubItem = 0;
  324.             Item.pszText = tmp;
  325.             ListView_InsertItem(lv, &Item);
  326.  
  327.             sprintf(tmp, "%.20s", gs.mod);
  328.             tmp[20] = 0;
  329.             Item.iSubItem++;
  330.             Item.pszText = tmp;
  331.             ListView_SetItem(lv, &Item);
  332.         }
  333.         for(i = 1; i < gs.total_fx; i++)
  334.         {
  335.             sprintf(tmp, "%s%s", gs.cur_fx == i ? "*" : "", gs.sample[i].loop < gs.sample[i].end ? "(L)" : "");
  336.             LVITEM Item = { };
  337.             Item.mask = LVIF_TEXT;
  338.             Item.iItem = int(i);
  339.             Item.iSubItem = 0;
  340.             Item.pszText = tmp;
  341.             ListView_InsertItem(lv, &Item);
  342.  
  343.             sprintf(tmp, "%u", i);
  344.             Item.iSubItem++;
  345.             ListView_SetItem(lv, &Item);
  346.  
  347.             sprintf(tmp, "%u", unsigned(gs.sample[i].volume));
  348.             Item.iSubItem++;
  349.             ListView_SetItem(lv, &Item);
  350.  
  351.             sprintf(tmp, "%u", unsigned(gs.sample[i].note));
  352.             Item.iSubItem++;
  353.             ListView_SetItem(lv, &Item);
  354.  
  355.             sprintf(tmp, "%u", unsigned(gs.sample[i].Priority));
  356.             Item.iSubItem++;
  357.             ListView_SetItem(lv, &Item);
  358.  
  359.             sprintf(tmp, "%.2f", double(gs.note2rate[gs.sample[i].note]));
  360.             Item.iSubItem++;
  361.             ListView_SetItem(lv, &Item);
  362.  
  363.             sprintf(tmp, "%u", gs.sample[i].end);
  364.             Item.iSubItem++;
  365.             ListView_SetItem(lv, &Item);
  366.         }
  367.         int Sel = ListView_GetItemCount(lv);
  368.         if(Sel > 0)
  369.         {
  370.             LVITEM Item = { };
  371.             Item.stateMask = LVIS_SELECTED;
  372.             Item.state = LVIS_SELECTED;
  373.             SendMessage(lv, LVM_SETITEMSTATE, WPARAM(0), LPARAM(&Item));
  374.             SetFocus(lv);
  375.         }
  376.  
  377.         *tmp = 0;
  378.         for(i = 0; i < 0x100; i++)
  379.         {
  380.             if(gs.badgs[i])
  381.             {
  382.                 sprintf(tmp + strlen(tmp), "%02X ", i);
  383.             }
  384.         }
  385.         Edit_SetText(GetDlgItem(dlg, IDE_GS), tmp);
  386.  
  387.         return Sel ? FALSE : TRUE;
  388.     }
  389.  
  390.     if(msg == WM_SYSCOMMAND && (wp & 0xFFF0) == SC_CLOSE)
  391.     {
  392.         EndDialog(dlg, 0);
  393.     }
  394.  
  395.     unsigned id;
  396.     unsigned nc;
  397.  
  398.     switch(msg)
  399.     {
  400.     case WM_NOTIFY:
  401.         {
  402.             LPNMHDR Hdr = LPNMHDR(lp);
  403.             id = unsigned(Hdr->idFrom);
  404.             nc = Hdr->code;
  405.         }
  406.         break;
  407.  
  408.     case WM_COMMAND:
  409.         id = LOWORD(wp);
  410.         nc = HIWORD(wp);
  411.         break;
  412.  
  413.     default:
  414.         return FALSE;
  415.     }
  416.  
  417.     if((id == IDCANCEL || id == IDOK) && (nc == BN_CLICKED))
  418.     {
  419.         EndDialog(dlg, 0);
  420.     }
  421.  
  422.     if((id == IDB_GS_CLEAR) && (nc == BN_CLICKED))
  423.     {
  424.         memset(gs.badgs, 0, sizeof gs.badgs);
  425.         Edit_SetText(GetDlgItem(dlg, IDE_GS), "");
  426.         return TRUE;
  427.     }
  428.  
  429.     if((id == IDB_GS_RESET) && (nc == BN_CLICKED))
  430.     {
  431.         gs.reset();
  432.         ListView_DeleteAllItems(lv);
  433.         return TRUE;
  434.     }
  435.  
  436.     if(((id == IDB_GS_PLAY) && (nc == BN_CLICKED)) || ((id == IDC_GSLIST) && (nc == NM_DBLCLK)))
  437.     {
  438.         unsigned i = unsigned(ListView_GetSelectionMark(lv));
  439.         if(i > 0x100)
  440.         {
  441.             return TRUE;
  442.         }
  443.  
  444.         if(!i && gs.modsize)
  445.         {
  446.             gs.mod_playing ^= 1;
  447.             if(gs.mod_playing)
  448.             {
  449.                 gs.restart_mod(0, 0);
  450.             }
  451.             else
  452.             {
  453.                 gs.stop_mod();
  454.             }
  455.  
  456.             sprintf(tmp, "(%s)", gs.mod_playing ? "P" : "S");
  457.             LVITEM Item = { };
  458.             Item.mask = LVIF_TEXT;
  459.             Item.pszText = tmp;
  460.             ListView_SetItem(lv, &Item);
  461.  
  462.             return TRUE;
  463.         }
  464.  
  465.         if(!gs.modsize)
  466.         {
  467.             i++;
  468.         }
  469.         gs.debug_note(i);
  470.         return TRUE;
  471.     }
  472.  
  473.     if((id == IDB_GS_SAVE) && (nc == BN_CLICKED))
  474.     {
  475.         unsigned i = unsigned(ListView_GetSelectionMark(lv));
  476.         if((i == 0) && (gs.modsize != 0))
  477.         {
  478.             SaveModDlg(wnd);
  479.             return TRUE;
  480.         }
  481.  
  482.         if(i > 0x100)
  483.         {
  484.             return TRUE;
  485.         }
  486.  
  487.         OPENFILENAME ofn = { };
  488.         char sndsavename[MAX_PATH];
  489.         *sndsavename = 0;
  490.         ListView_GetItemText(lv, i, 1, sndsavename, _countof(sndsavename));
  491.         strcat(sndsavename, ".pcm");
  492.  
  493.         ofn.lStructSize = (WinVerMajor < 5) ? OPENFILENAME_SIZE_VERSION_400 : sizeof(OPENFILENAME);
  494.         ofn.lpstrFilter = "PCM sample (.pcm)\0*.pcm\0";
  495.         ofn.lpstrFile = sndsavename;
  496.         ofn.lpstrDefExt = "pcm";
  497.         ofn.nMaxFile = _countof(sndsavename);
  498.         ofn.lpstrTitle = "Save Sample";
  499.         ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_NOCHANGEDIR | OFN_EXPLORER | OFN_ENABLESIZING;
  500.         ofn.hwndOwner = wnd;
  501.         ofn.nFilterIndex = 1;
  502.         if(GetSaveFileName(&ofn))
  503.         {
  504.             gs.debug_save_note(i, sndsavename);
  505.         }
  506.         return TRUE;
  507.     }
  508.     return FALSE;
  509. }
  510.  
  511. void mon_gsdialog()
  512. {
  513.    if (conf.gs_type == 2)
  514.       DialogBox(hIn, MAKEINTRESOURCE(IDD_GS), wnd, gsdlg);
  515.    else MessageBox(wnd, "high-level GS emulation\nis not initialized", nullptr, MB_OK | MB_ICONERROR);
  516. }
  517. #else
  518. void mon_gsdialog() {}
  519. #endif
  520.