void TraceInMemoryCallback(const wchar_t * Msg) { if (IsTracing) { DoTrace(L"PAS", L"unk", ::GetCurrentThreadId(), Msg); } }
void ExecuteLoop(void) /* fetch and dispatch loop */ { register void (**tab)(void); tab=table; rep: while(--nInst>=0) { #ifdef TRACE if (pc>tracelo) DoTrace(); #endif tab[code=RW(pc++)](); } if (doPoll) dosignal(); if(extraFlag) { nInst=nInst2; ExceptionProcessing(); if(nInst>0) goto rep; } }
void DoAssert(const wchar_t * Message, const wchar_t * Filename, uintptr_t LineNumber) { if (IsTracing) { DoTrace(Filename, L"assert", LineNumber, Message); } _wassert(Message, Filename, (unsigned int)LineNumber); }
void DoTraceFmt(const wchar_t * SourceFile, const wchar_t * Func, uintptr_t Line, const wchar_t * AFormat, va_list Args) { DebugAssert(IsTracing); UnicodeString Message = FormatV(AFormat, Args); DoTrace(SourceFile, Func, Line, Message.c_str()); }
int AsyncTrace( struct TDebug *obj, int ms ) { char Instr[2] = {0, 0}; int ok = TRUE; void *wait; if( obj->CurrentThread ) { BreakSel = obj->CurrentThread->Cs; BreakOffset = obj->CurrentThread->Eip; ReadMem( obj->CurrentThread, BreakSel, BreakOffset, Instr, 2 ); if ( Instr[0] == 0xF && Instr[1] == 0xB ) { BreakOffset += 7; AddBreak( obj, BreakSel, BreakOffset, TRUE ); ok = AsyncGo( obj, ms ); if( ok ) { ClearBreak( obj, BreakSel, BreakOffset ); } else { HasBreak = TRUE; } return( ok ); } else { RdosResetSignal( obj->UserSignal ); DoTrace( obj ); wait = RdosWaitTimeout( obj->UserWait, ms ); if( wait ) { return( TRUE ); } else return( FALSE ); } } return( TRUE ); }
void Trace( struct TDebug *obj ) { char Instr[2] = {0, 0}; int Sel; long Offset; if( obj->CurrentThread ) { Sel = obj->CurrentThread->Cs; Offset = obj->CurrentThread->Eip; ReadMem( obj->CurrentThread, Sel, Offset, Instr, 2 ); if ( Instr[0] == 0xF && Instr[1] == 0xB ) { Offset += 7; AddBreak( obj, Sel, Offset, TRUE ); Go( obj ); ClearBreak( obj, Sel, Offset ); } else { RdosResetSignal( obj->UserSignal ); DoTrace( obj ); RdosWaitForever( obj->UserWait ); } } }
void DoTraceFmt(const wchar_t * SourceFile, const wchar_t * Func, uintptr_t Line, const wchar_t * AFormat, TVarRec * /*Args*/, const int /*Args_Size*/) { DoTrace(SourceFile, Func, Line, AFormat); }
void ExecuteLoop(void) { static void *instbl[65536]; static syntab syntbl[65536]; static char littab[][20]={"","#1","#2","#4","CCR","SR","USP","","D%1d","A%1d","(A%1d)","(A%1d)+","-(A%1d)", "$%04x(A%1d)","$%02x(A%1d,%1s%1d)", "$%04x.W", "$%08x.L","$%04x(PC)","$%02x(PC,%1s%1d)" }; static char OpCode[]="\0Invalid\0a_line\0abcd\0add.b\0add.l\0add.w\0adda.l\0adda.w\0addi.b\0addi.l\0addi.w\0addq.b\0addq.l\0addq.w\0addx.b\0addx.l\0addx.w\0and.b\0and.l\0and.w\0andi\0andi.b\0andi.l\0andi.w\0asl\0asl.b\0asl.l\0asl.w\0asr\0asr.b\0asr.l\0asr.w\0bcc.l\0bcc.s\0bcc_BAD\0bccc.s\0bchg\0bchg.s\0bclr\0bclr.s\0bcs.s\0beq.l\0beq.s\0bge.s\0bgt.s\0bhi.s\0ble.s\0bls.s\0blt.s\0bmi.s\0bne.l\0bne.s\0bpl.s\0bra.l\0bra.s\0bset\0bset.s\0bsr\0btst\0btst.s\0bvc.s\0bvs.s\0chk.w\0clr.b\0clr.l\0clr.w\0cmp.b\0cmp.l\0cmp.w\0cmpa.l\0cmpa.w\0cmpi.b\0cmpi.l\0cmpi.w\0cmpm.b\0cmpm.l\0cmpm.w\0dbcc\0dbcs\0dbeq\0dbf\0dbge\0dbgt\0dbhi\0dble\0dbls\0dblt\0dbmi\0dbne\0dbpl\0dbt\0dbvc\0dbvs\0divs.w\0divu.w\0eor.b\0eor.l\0eor.w\0eori\0eori.b\0eori.l\0eori.w\0exg_a\0exg_ad\0exg_d\0ext.l\0ext.w\0f_line\0illegal\0jmp\0jsr\0lea\0link\0lsl\0lsl.b\0lsl.l\0lsl.w\0lsr\0lsr.b\0lsr.l\0lsr.w\0move\0move.b\0move.l\0move.w\0movea.l\0movea.w\0movem.l\0movem.w\0movep.l\0movep.w\0moveq\0muls.w\0mulu.w\0nbcd\0neg.b\0neg.l\0neg.w\0negx.b\0negx.l\0negx.w\0nop\0not.b\0not.l\0not.w\0or.b\0or.l\0or.w\0ori\0ori.b\0ori.l\0ori.w\0pea\0reset\0rol\0rol.b\0rol.l\0rol.w\0ror\0ror.b\0ror.l\0ror.w\0roxl\0roxl.b\0roxl.l\0roxl.w\0roxr\0roxr.b\0roxr.l\0roxr.w\0rte\0rtr\0rts\0sCC\0sbcd\0scc\0scs\0seq\0sf\0sge\0sgt\0shi\0sle\0sls\0slt\0smi\0sne\0spl\0st\0stop\0sub.b\0sub.l\0sub.w\0s ubi.b\0subi.l\0subi.w\0subq.b\0subq.l\0subq.w\0subx.b\0subx.l\0subx.w\0svc\0svs\0swap\0tas\0trap\0trap#0\0trap#1\0trap#2\0trap#3\0trap#4\0trapv\0tst.b\0tst.l\0tst.w\0unlk\0\0"; register void **itab; #if 1 /*MANYREGS*/ #ifndef G_reg #ifdef NEW_AREG w32* reg=g_reg; #else w32 *aReg=reg+8; w32* reg=aReg-8; #endif #endif w32 (**GetEA)(ashort) /*REGP1*/ = iexl_GetEA; rw8 (**GetFromEA_b)(void) = iexl_GetFromEA_b; rw16 (**GetFromEA_w)(void) = iexl_GetFromEA_w; rw32 (**GetFromEA_l)(void) = iexl_GetFromEA_l; void (**PutToEA_b)(ashort,aw8) /*REGP2*/ = iexl_PutToEA_b; void (**PutToEA_w)(ashort,aw16) /*REGP2*/ = iexl_PutToEA_w; void (**PutToEA_l)(ashort,aw32) /*REGP2*/ = iexl_PutToEA_l; Cond (**ConditionTrue)(void) = ll_ConditionTrue; w32 *theROM=ll_theROM; #else #define GetFromEA_b iexl_GetFromEA_b #define GetFromEA_w iexl_GetFromEA_w #define GetFromEA_l iexl_GetFromEA_l #define PutToEA_b iexl_PutToEA_b #define PutToEA_w iexl_PutToEA_w #define PutToEA_l iexl_PutToEA_l #endif code=0; /* loop possibly sets only 16 bits ! */ itab=instbl; #define IE_XL goto run_it; /*#include "iexl_general.h"*/ #include "instructions_ao.c" /* include instructions */ #include "instructions_pz.c" /*#include "iexl_ug.h"*/ run_it: if (unlikely(!instbl_valid)) { #define IE_XL_II #include "Init.c" /*XSetTable(instbl);*/ instbl_valid=1; } theROM=ll_theROM; ENTER_IEXL; /* load vars into regs etc .*/ nextI: if (likely(--nInst>=0)) { #ifdef TRACE if (pc>=tracelo) DoTrace(); #endif /*DbgInfo();*/ #if defined(ASSGN_486) goto *itab[ASSGN_486()]; #else goto *itab[ASSGN_CODE(RW(pc++))]; #endif } #if 0 if (regEmux) { nInst= (extraFlag ? 0 : reInst); vm_regemu(); goto nextI; } #endif if (doPoll) dosignal(); if(extraFlag) { nInst=nInst2; ExceptionProcessing(); if(nInst>0) goto nextI; } }