--- BasiliskII/src/uae_cpu/newcpu.cpp 2002/10/01 09:39:55 1.17 +++ BasiliskII/src/uae_cpu/newcpu.cpp 2005/06/11 06:43:24 1.21 @@ -55,12 +55,14 @@ cpuop_func *cpufunctbl[65536]; #if FLIGHT_RECORDER struct rec_step { + uae_u32 pc; +#if FLIGHT_RECORDER >= 2 uae_u32 d[8]; uae_u32 a[8]; - uae_u32 pc; +#endif }; -const int LOG_SIZE = 8192; +const int LOG_SIZE = 32768; static rec_step log[LOG_SIZE]; static int log_ptr = -1; // First time initialization @@ -72,10 +74,16 @@ static const char *log_filename(void) void m68k_record_step(uaecptr pc) { - for (int i = 0; i < 8; i++) { - log[log_ptr].d[i] = m68k_dreg(regs, i); - log[log_ptr].a[i] = m68k_areg(regs, i); +#if FLIGHT_RECORDER >= 2 + /* XXX: if LSB is set, we are recording from generated code and we + don't support registers recording yet. */ + if ((pc & 1) == 0) { + for (int i = 0; i < 8; i++) { + log[log_ptr].d[i] = m68k_dreg(regs, i); + log[log_ptr].a[i] = m68k_areg(regs, i); + } } +#endif log[log_ptr].pc = pc; log_ptr = (log_ptr + 1) % LOG_SIZE; } @@ -87,19 +95,34 @@ static void dump_log(void) return; for (int i = 0; i < LOG_SIZE; i++) { int j = (i + log_ptr) % LOG_SIZE; - fprintf(f, "pc %08x\n", log[j].pc); - fprintf(f, "d0 %08x d1 %08x d2 %08x d3 %08x\n", log[j].d[0], log[j].d[1], log[j].d[2], log[j].d[3]); - fprintf(f, "d4 %08x d5 %08x d6 %08x d7 %08x\n", log[j].d[4], log[j].d[5], log[j].d[6], log[j].d[7]); - fprintf(f, "a0 %08x a1 %08x a2 %08x a3 %08x\n", log[j].a[0], log[j].a[1], log[j].a[2], log[j].a[3]); - fprintf(f, "a4 %08x a5 %08x a6 %08x a7 %08x\n", log[j].a[4], log[j].a[5], log[j].a[6], log[j].a[7]); + uae_u32 pc = log[j].pc & ~1; + fprintf(f, "pc %08x", pc); +#if FLIGHT_RECORDER >= 2 + fprintf(f, "\n"); + if ((log[j].pc & 1) == 0) { + fprintf(f, "d0 %08x d1 %08x d2 %08x d3 %08x\n", log[j].d[0], log[j].d[1], log[j].d[2], log[j].d[3]); + fprintf(f, "d4 %08x d5 %08x d6 %08x d7 %08x\n", log[j].d[4], log[j].d[5], log[j].d[6], log[j].d[7]); + fprintf(f, "a0 %08x a1 %08x a2 %08x a3 %08x\n", log[j].a[0], log[j].a[1], log[j].a[2], log[j].a[3]); + fprintf(f, "a4 %08x a5 %08x a6 %08x a7 %08x\n", log[j].a[4], log[j].a[5], log[j].a[6], log[j].a[7]); + } +#else + fprintf(f, " | "); +#endif #if ENABLE_MON - disass_68k(f, log[j].pc); + disass_68k(f, pc); #endif } fclose(f); } #endif +#if ENABLE_MON +static void dump_regs(void) +{ + m68k_dumpstate(NULL); +} +#endif + #define COUNT_INSTRS 0 #if COUNT_INSTRS @@ -163,11 +186,11 @@ static __inline__ unsigned int cft_map ( #endif } -cpuop_rettype REGPARAM2 op_illg_1 (uae_u32 opcode) REGPARAM; +void REGPARAM2 op_illg_1 (uae_u32 opcode) REGPARAM; -cpuop_rettype REGPARAM2 op_illg_1 (uae_u32 opcode) +void REGPARAM2 op_illg_1 (uae_u32 opcode) { - cpuop_return( op_illg (cft_map (opcode)) ); + op_illg (cft_map (opcode)); } static void build_cpufunctbl (void) @@ -1152,14 +1175,20 @@ void m68k_reset (void) fpu_reset(); #if FLIGHT_RECORDER + log_ptr = 0; + memset(log, 0, sizeof(log)); +#endif + #if ENABLE_MON - if (log_ptr == -1) { + static bool first_time = true; + if (first_time) { + first_time = false; + mon_add_command("regs", dump_regs, "regs Dump m68k emulator registers\n"); +#if FLIGHT_RECORDER // Install "log" command in mon mon_add_command("log", dump_log, "log Dump m68k emulation log\n"); - } #endif - log_ptr = 0; - memset(log, 0, sizeof(log)); + } #endif } @@ -1189,18 +1218,18 @@ void m68k_emulop(uae_u32 opcode) MakeFromSR(); } -cpuop_rettype REGPARAM2 op_illg (uae_u32 opcode) +void REGPARAM2 op_illg (uae_u32 opcode) { uaecptr pc = m68k_getpc (); if ((opcode & 0xF000) == 0xA000) { Exception(0xA,0); - cpuop_return(CFLOW_TRAP); + return; } if ((opcode & 0xF000) == 0xF000) { Exception(0xB,0); - cpuop_return(CFLOW_TRAP); + return; } write_log ("Illegal instruction: %04x at %08lx\n", opcode, pc); @@ -1209,7 +1238,7 @@ cpuop_rettype REGPARAM2 op_illg (uae_u32 #endif Exception (4,0); - cpuop_return(CFLOW_TRAP); + return; } void mmu_op(uae_u32 opcode, uae_u16 extra) @@ -1307,7 +1336,7 @@ int m68k_do_specialties (void) } if (SPCFLAGS_TEST( SPCFLAG_BRK )) { SPCFLAGS_CLEAR( SPCFLAG_BRK ); - return CFLOW_EXEC_RETURN; + return 1; } return 0; } @@ -1320,6 +1349,7 @@ void m68k_do_execute (void) m68k_record_step(m68k_getpc()); #endif (*cpufunctbl[opcode])(opcode); + cpu_check_ticks(); if (SPCFLAGS_TEST(SPCFLAG_ALL_BUT_EXEC_RETURN)) { if (m68k_do_specialties()) return; @@ -1327,7 +1357,7 @@ void m68k_do_execute (void) } } -#if USE_JIT && !defined(X86_ASSEMBLY) +#if USE_JIT && !(defined(X86_ASSEMBLY) || defined(X86_64_ASSEMBLY)) void m68k_compile_execute (void) { for (;;) {