Subversion Repositories pentevo

Rev

Rev 716 | Blame | Last modification | View Log | Download | RSS feed

  1. #include "std.h"
  2.  
  3. #include "emul.h"
  4. #include "vars.h"
  5. #include "draw.h"
  6. #include "dx.h"
  7. #include "debug.h"
  8. #include "dbgpaint.h"
  9. #include "dbgmem.h"
  10. #include "dbgrwdlg.h"
  11. #include "memory.h"
  12. #include "gui.h"
  13. #include "util.h"
  14.  
  15. void out(unsigned port, unsigned char val);
  16.  
  17. unsigned find1dlg(unsigned start)
  18. {
  19.    static char ftext[12] = "";
  20.    strcpy(str, ftext);
  21.    filledframe(10,10,16,4);
  22.    tprint(10,10,"  find string   ", FRM_HEADER);
  23.    tprint(11,12,"text:", FFRAME_INSIDE);
  24.    if (!inputhex(17,12,8,false)) return -1;
  25.    strcpy(ftext, str);
  26.    unsigned len = strlen(ftext);
  27.    unsigned i; //Alone Coder 0.36.7
  28.    for (unsigned ptr = memadr(start+1); ptr != start; ptr = memadr(ptr+1)) {
  29.       for (/*unsigned*/ i = 0; i < len; i++)
  30.          if (editrm(memadr(ptr+i)) != ftext[i]) break;
  31.       if (i == len) return ptr;
  32.    }
  33.    tprint(11,12,"  not found   ", FFRAME_ERROR);
  34.    debugflip();
  35.    while (!process_msgs());
  36.    return -1;
  37. }
  38.  
  39. unsigned find2dlg(unsigned start)
  40. {
  41.    static unsigned code = 0xF3, mask = 0xFF; char ln[64];
  42.    filledframe(10,10,16,5);
  43.    tprint(10,10,"   find data    ", FRM_HEADER);
  44.    sprintf(ln, "code: %08lX", _byteswap_ulong(code)); tprint(11,12,ln, FFRAME_INSIDE);
  45.    sprintf(ln, "mask: %08lX", _byteswap_ulong(mask)); tprint(11,13,ln, FFRAME_INSIDE);
  46.    sprintf(str, "%08lX", _byteswap_ulong(code));
  47.    if (!inputhex(17,12,8,true)) return -1;
  48.    sscanf(str, "%x", &code); code = _byteswap_ulong(code);
  49.    tprint(17,12,str, FFRAME_INSIDE);
  50.    sprintf(str, "%08lX", _byteswap_ulong(mask));
  51.    if (!inputhex(17,13,8,true)) return -1;
  52.    sscanf(str, "%x", &mask); mask = _byteswap_ulong(mask);
  53.    unsigned i; //Alone Coder 0.36.7
  54.    for (unsigned ptr = memadr(start+1); ptr != start; ptr = memadr(ptr+1)) {
  55.       unsigned char *cd = (unsigned char*)&code, *ms = (unsigned char*)&mask;
  56.       for (/*unsigned*/ i = 0; i < 4; i++)
  57.          if ((editrm(memadr(ptr+i)) & ms[i]) != (cd[i] & ms[i])) break;
  58.       if (i == 4) return ptr;
  59.    }
  60.    tprint(11,12,"  not found   ", FFRAME_ERROR);
  61.    tprint(11,13,"              ", FFRAME_ERROR);
  62.    debugflip();
  63.    while (!process_msgs());
  64.    return -1;
  65. }
  66.  
  67. void mon_fill()
  68. {
  69.    filledframe(6,10,26,5);
  70.    char ln[64]; sprintf(ln, "start: %04X end: %04X", addr, end);
  71.    tprint(6,10, "    fill memory block     ", FRM_HEADER);
  72.    tprint(7,12, "pattern (hex):", FFRAME_INSIDE);
  73.    tprint(7,13, ln, FFRAME_INSIDE);
  74.  
  75.    static char fillpattern[10] = "00";
  76.  
  77.    unsigned char pattern[4];
  78.    unsigned fillsize = 0;
  79.  
  80.    strcpy(str, fillpattern);
  81.    if (!inputhex(22,12,8,true)) return;
  82.    strcpy(fillpattern, str);
  83.  
  84.    if (!fillpattern[0])
  85.        strcpy(fillpattern, "00");
  86.  
  87.    for (fillsize = 0; fillpattern[2*fillsize]; fillsize++) {
  88.       if (!fillpattern[2*fillsize+1]) fillpattern[2*fillsize+1] = '0', fillpattern[2*fillsize+2] = 0;
  89.       pattern[fillsize] = hex(fillpattern + 2*fillsize);
  90.    }
  91.    tprint(22,12,"        ", FFRAME_INSIDE);
  92.    tprint(22,12,fillpattern, FFRAME_INSIDE);
  93.  
  94.    unsigned a1 = input4(14,13,addr); if (a1 == -1) return;
  95.    addr = a1; tprint(14,13,str,FFRAME_INSIDE);
  96.    a1 = input4(24,13,end); if (a1 == -1) return;
  97.    end = a1;
  98.  
  99.    unsigned pos = 0;
  100.    for (a1 = addr; a1 <= end; a1++) {
  101.       cpu.DirectWm(a1, pattern[pos]);
  102.       if (++pos == fillsize) pos = 0;
  103.    }
  104. }
  105.  
  106. // ┬√їюф шч ьюэшЄюЁр
  107. void mon_emul()
  108. {
  109.    for(unsigned i = 0; i < CpuMgr.GetCount(); i++)
  110.    {
  111.        Z80 &cpu = CpuMgr.Cpu(i);
  112.        cpu.dbgchk = isbrk(cpu);
  113.        cpu.dbgbreak = 0;
  114.    }
  115.    dbgbreak = 0;
  116. }
  117.  
  118. void mon_scr(char alt)
  119. {
  120.    temp.scale = temp.mon_scale;
  121.    apply_video();
  122.  
  123.    memcpy(save_buf, rbuf, rb2_offs);
  124.    paint_scr(alt);
  125.    flip(); if (conf.noflic) flip();
  126.    memcpy(rbuf, save_buf, rb2_offs);
  127.  
  128.    while (!process_msgs()) Sleep(20);
  129.    temp.rflags = RF_MONITOR;
  130.    temp.mon_scale = temp.scale;
  131.    temp.scale = 1;
  132.    set_video();
  133. }
  134.  
  135. void mon_scr0() { mon_scr(0); }
  136. void mon_scr1() { mon_scr(1); }
  137. void mon_scray() { mon_scr(2); }
  138.  
  139. void mon_exitsub()
  140. {
  141.    Z80 &cpu = CpuMgr.Cpu();
  142.    cpu.dbgchk = 1;
  143.    cpu.dbgbreak = 0;
  144.    dbgbreak = 0;
  145.    cpu.dbg_stophere = cpu.DirectRm(cpu.sp)+0x100*cpu.DirectRm(cpu.sp+1);
  146. }
  147.  
  148. void editbank()
  149. {
  150.    unsigned x = input2(ports_x+5, ports_y+1, comp.p7FFD);
  151.    if (x != -1)
  152.    {
  153.        comp.p7FFD = x;
  154.        set_banks();
  155.    }
  156. }
  157.  
  158. void editextbank()
  159. {
  160.    if(dbg_extport == -1)
  161.        return;
  162.    unsigned x = input2(ports_x+5, ports_y+2, dgb_extval);
  163.    if (x != -1)
  164.        out(dbg_extport, (unsigned char)x);
  165. }
  166.  
  167. void mon_nxt()
  168. {
  169.    if (activedbg == WNDREGS) activedbg = WNDTRACE;
  170.    else if (activedbg == WNDTRACE) activedbg = WNDMEM;
  171.    else if (activedbg == WNDMEM) activedbg = WNDREGS;
  172. }
  173.  
  174. void mon_prv() { mon_nxt(); mon_nxt(); }
  175. void mon_dump() { mem_dump ^= 1; mem_sz = mem_dump ? 32:8; }
  176.  
  177. void mon_switch_dump()
  178. {
  179.     static const unsigned DumpModes[] = { ED_MEM, ED_PHYS, ED_LOG, ED_CMOS, ED_NVRAM };
  180.     static unsigned Idx = 0;
  181.     ++Idx;
  182.     Idx %= ED_MAX;
  183.     editor = DumpModes[Idx];
  184. }
  185.  
  186. #define tool_x 18
  187. #define tool_y 12
  188.  
  189. void mon_tool()
  190. {
  191.    Z80 &cpu = CpuMgr.Cpu();
  192.    static unsigned char unref = 0xCF;
  193.    if (ripper) {
  194.       OPENFILENAME ofn = { 0 };
  195.       char savename[0x200]; *savename = 0;
  196.       ofn.lStructSize = (WinVerMajor < 5) ? OPENFILENAME_SIZE_VERSION_400 : sizeof(OPENFILENAME);
  197.       ofn.lpstrFilter = "Memory dump\0*.bin\0";
  198.       ofn.lpstrFile = savename; ofn.nMaxFile = sizeof savename;
  199.       ofn.lpstrTitle = "Save ripped data";
  200.       ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
  201.       ofn.hwndOwner = wnd;
  202.       ofn.lpstrDefExt = "bin";
  203.       ofn.nFilterIndex = 1;
  204.       if (GetSaveFileName(&ofn)) {
  205.          for (unsigned i = 0; i < 0x10000; i++)
  206.             snbuf[i] = (cpu.membits[i] & ripper) ? cpu.DirectRm(i) : unref;
  207.          FILE *ff = fopen(savename, "wb");
  208.          if (ff) fwrite(snbuf, 1, 0x10000, ff), fclose(ff);
  209.       }
  210.       ripper = 0;
  211.    } else {
  212.       filledframe(tool_x, tool_y, 17, 6);
  213.       tprint(tool_x, tool_y, "  ripper's tool  ", FRM_HEADER);
  214.       tprint(tool_x+1,tool_y+2, "trace reads:", FFRAME_INSIDE);
  215.       *(unsigned*)str = 'Y';
  216.       if (!inputhex(tool_x+15,tool_y+2,1,false)) return;
  217.       tprint(tool_x+15,tool_y+2,str,FFRAME_INSIDE);
  218.       if (*str == 'Y' || *str == 'y' || *str == '1') ripper |= MEMBITS_R;
  219.       *(unsigned*)str = 'N';
  220.       tprint(tool_x+1,tool_y+3, "trace writes:", FFRAME_INSIDE);
  221.       if (!inputhex(tool_x+15,tool_y+3,1,false)) { ripper = 0; return; }
  222.       tprint(tool_x+15,tool_y+3,str,FFRAME_INSIDE);
  223.       if (*str == 'Y' || *str == 'y' || *str == '1') ripper |= MEMBITS_W;
  224.       tprint(tool_x+1,tool_y+4, "unref. byte:", FFRAME_INSIDE);
  225.       unsigned ub;
  226.       if ((ub = input2(tool_x+14,tool_y+4,unref)) == -1) { ripper = 0; return; }
  227.       unref = (unsigned char)ub;
  228.       if (ripper)
  229.           for (unsigned i = 0; i < 0x10000; i++)
  230.               cpu.membits[i] &= ~(MEMBITS_R | MEMBITS_W);
  231.    }
  232. }
  233.  
  234. void mon_setup_dlg()
  235. {
  236. #ifdef MOD_SETTINGS
  237.    setup_dlg();
  238.    temp.rflags = RF_MONITOR;
  239.    set_video();
  240. #endif
  241. }
  242.  
  243. void mon_scrshot() { show_scrshot++; if (show_scrshot == 3) show_scrshot = 0; }
  244.  
  245. void mon_switch_cpu()
  246. {
  247. //    CpuMgr.CopyToPrev();
  248.     Z80 &cpu0 = CpuMgr.Cpu();
  249.     cpu0.dbgbreak = 0;
  250.     CpuMgr.SwitchCpu();
  251.     Z80 &cpu1 = CpuMgr.Cpu();
  252.  
  253.     if(cpu1.trace_curs == -1)
  254.         cpu1.trace_curs = cpu1.pc;
  255.     if(cpu1.trace_top == -1)
  256.         cpu1.trace_top = cpu1.pc;
  257.     if(cpu1.trace_mode == -1)
  258.         cpu1.trace_mode = 0;
  259.  
  260.     debugscr();
  261.     debugflip();
  262. }
  263.