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 ); } } }
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 ); }