--- uae/src/debug.c 2018/04/24 16:44:45 1.1.1.5 +++ uae/src/debug.c 2018/04/24 16:56:34 1.1.1.8 @@ -19,7 +19,6 @@ #include "uae.h" #include "memory.h" #include "custom.h" -#include "readcpu.h" #include "newcpu.h" #include "debug.h" #include "cia.h" @@ -31,13 +30,18 @@ static uaecptr skipaddr; static int do_skip; int debugging = 0; +static FILE *logfile; + void activate_debugger (void) { + if (logfile) + fclose (logfile); + logfile = 0; do_skip = 0; if (debugger_active) return; debugger_active = 1; - regs.spcflags |= SPCFLAG_BRK; + set_special (SPCFLAG_BRK); debugging = 1; /* use_debugger = 1; */ } @@ -167,7 +171,6 @@ static void modulesearch (void) printf ("Found possible MarkII module at %lx, length unknown.\n", ptr); } } - } } } @@ -272,7 +275,10 @@ static void writeintomem (char **c) } else printf("Invalid address %08x\n",addr); } - + +static int trace_same_insn_count; +static uae_u8 trace_insn_copy[10]; +static struct regstruct trace_prev_regs; void debug (void) { char input[80]; @@ -280,8 +286,27 @@ void debug (void) bogusframe = 1; + if (do_skip && skipaddr == 0xC0DEDBAD) { +#if 0 + if (trace_same_insn_count > 0) { + if (memcmp (trace_insn_copy, regs.pc_p, 10) == 0 + && memcmp (trace_prev_regs.regs, regs.regs, sizeof regs.regs) == 0) + { + trace_same_insn_count++; + return; + } + } + if (trace_same_insn_count > 1) + fprintf (logfile, "[ repeated %d times ]\n", trace_same_insn_count); +#endif + m68k_dumpstate (logfile, &nextpc); + trace_same_insn_count = 1; + memcpy (trace_insn_copy, regs.pc_p, 10); + memcpy (&trace_prev_regs, ®s, sizeof regs); + } + if (do_skip && (m68k_getpc() != skipaddr/* || regs.a[0] != 0x1e558*/)) { - regs.spcflags |= SPCFLAG_BRK; + set_special (SPCFLAG_BRK); return; } do_skip = 0; @@ -297,7 +322,7 @@ void debug (void) if (++firsthist == MAX_HIST) firsthist = 0; } - m68k_dumpstate (&nextpc); + m68k_dumpstate (stdout, &nextpc); nxdis = nextpc; nxmem = 0; for (;;) { @@ -310,8 +335,8 @@ void debug (void) inptr = input; cmd = next_char (&inptr); switch (cmd) { - case 'c': dumpcia (); dumpcustom (); break; - case 'r': m68k_dumpstate (&nextpc); break; + case 'c': dumpcia (); dumpdisk (); dumpcustom (); break; + case 'r': m68k_dumpstate (stdout, &nextpc); break; case 'M': modulesearch (); break; case 'C': cheatsearch (&inptr); break; case 'W': writeintomem (&inptr); break; @@ -372,20 +397,26 @@ void debug (void) count = readhex(&inptr); else count = 10; - m68k_disasm(daddr, &nxdis, count); + m68k_disasm (stdout, daddr, &nxdis, count); } break; - case 't': regs.spcflags |= SPCFLAG_BRK; return; + case 't': set_special (SPCFLAG_BRK); return; case 'z': skipaddr = nextpc; do_skip = 1; - regs.spcflags |= SPCFLAG_BRK; + set_special (SPCFLAG_BRK); return; case 'f': - skipaddr = readhex(&inptr); + skipaddr = readhex (&inptr); do_skip = 1; - regs.spcflags |= SPCFLAG_BRK; + set_special (SPCFLAG_BRK); + if (skipaddr == 0xC0DEDBAD) { + trace_same_insn_count = 0; + logfile = fopen ("uae.trace", "w"); + memcpy (trace_insn_copy, regs.pc_p, 10); + memcpy (&trace_prev_regs, ®s, sizeof regs); + } return; case 'q': uae_quit(); @@ -424,9 +455,9 @@ void debug (void) #ifdef NEED_TO_DEBUG_BADLY regs = history[temp]; regflags = historyf[temp]; - m68k_dumpstate(NULL); + m68k_dumpstate (NULL); #else - m68k_disasm(history[temp], NULL, 1); + m68k_disasm (stdout, history[temp], NULL, 1); #endif if (++temp == MAX_HIST) temp = 0; }