Subversion Repositories pentevo

Rev

Rev 1134 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

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