extern void AsmMoveDot( a_window *wnd, address addr ) { int row; asm_window *asw; DIPHDL( cue, ch1 ); DIPHDL( cue, ch2 ); if( wnd == NULL ) return; asw = WndAsm( wnd ); if( DeAliasAddrCue( asw->mod, addr, ch1 ) != SR_NONE && DeAliasAddrCue( asw->mod, asw->dotaddr, ch2 ) != SR_NONE ) { if( CueMod( ch1 ) == CueMod( ch2 ) && CueFileId( ch1 ) == CueFileId( ch2 ) && CueLine( ch1 ) == CueLine( ch2 ) ) { return; } } WndNoSelect( wnd ); row = AsmAddrRow( wnd, addr ); if( row == WndRows( wnd ) ) { AsmSetFirst( wnd, addr, TRUE ); row = AsmAddrRow( wnd, addr ); WndDirtyCurr( wnd ); WndNewCurrent( wnd, row, PIECE_CURRENT ); WndRepaint( wnd ); row = 0; } else { WndDirtyCurr( wnd ); WndNewCurrent( wnd, row, PIECE_CURRENT ); } AsmSetDotAddr( wnd, addr ); }
static a_window *DoWndSrcInspect( address addr, bool existing ) { a_window *wnd; // bool nil; mod_handle mod; DIPHDL( cue, ch ); a_window *active; active = WndFindActive(); // nil = false; if( IS_NIL_ADDR( addr ) ) { // nil = true; addr = Context.execution; } wnd = NULL; if( existing ) { wnd = WndFindExisting( WND_SOURCE ); } if( wnd == NULL ) { if( DeAliasAddrMod( addr, &mod ) == SR_NONE || DeAliasAddrCue( mod, addr, ch ) == SR_NONE ) { ch = NULL; } wnd = DoWndSrcOpen( ch, existing ); } if( !SrcMoveDot( wnd, addr ) || !SrcHasFileOpen( wnd ) ) { if( active != NULL ) WndRestoreToFront( active ); return( NULL ); } return( wnd ); }
static bool ExactCueAt( asm_window *asw, address addr, cue_handle *ch ) { if( !asw->source ) return( FALSE ); if( DeAliasAddrCue( NO_MOD, addr, ch ) == SR_NONE ) return( FALSE ); if( AddrComp( CueAddr( ch ), addr ) ) return( FALSE ); return( TRUE ); }
void BreakAllModEntries( mod_handle handle ) { name_list list; address addr; int i; bool have_mod_cue; sym_info sinfo; DIPHDL( cue, ch ); DIPHDL( cue, ch_mod ); NameListInit( &list, WF_CODE ); NameListAddModules( &list, handle, false, true ); have_mod_cue = FindFirstCue( handle, ch_mod ); for( i = 0; i < NameListNumRows( &list ); ++i ) { addr = NameListAddr( &list, i ); SymInfo( NameListHandle( &list, i ), NULL, &sinfo ); if( !sinfo.is_global && !sinfo.is_public ) continue; if( have_mod_cue && DeAliasAddrCue( handle, addr, ch ) != SR_NONE ) { if( CueFileId( ch ) != CueFileId( ch_mod ) ) { continue; } } if( FindBreak( addr ) != NULL ) { continue; } AddBreak( addr ); } NameListFree( &list ); }
extern bool SrcMoveDot( a_window *wnd, address addr ) { unsigned line; mod_handle mod; file_window *file; DIPHDL( cue, ch ); if( wnd == NULL ) return( FALSE ); file = WndFile( wnd ); if( file->mod == NO_MOD && !file->track ) return( FALSE ); if( IS_NIL_ADDR( addr ) ) { WndScrollAbs( wnd, 0 ); return( FALSE ); } DeAliasAddrMod( addr, &mod ); if( DeAliasAddrCue( mod, addr, ch ) == SR_NONE ) { if( LineCue( mod, 0, 0, 0, ch ) == SR_NONE ) return( FALSE ); } line = CueLine( ch ); if( mod != file->mod || CueFileId( ch ) != file->file_id ) { if( !file->track ) return( FALSE ); FileTrack( wnd, ch ); } --line; WndScrollAbs( wnd, line ); // WndMoveCurrent( wnd, line, PIECE_SOURCE ); FileSetDotAddr( wnd, addr ); FileSetTitle( wnd, CueMod( ch ) ); return( TRUE ); }
static unsigned ActiveLine( void ) { DIPHDL( cue, ch ); if( DeAliasAddrCue( ContextMod, Context.execution, ch ) == SR_NONE ) return( 0 ); return( CueLine( ch ) - 1 ); }
static remap_return ReMapOnePoint( brkp *bp, image_entry *image ) { mod_handle himage, mod; bool ok; address addr; DIPHDL( cue, ch ); DIPHDL( cue, ch2 ); remap_return rc = REMAP_REMAPPED; if( !bp->status.b.unmapped ) return( REMAP_WRONG_IMAGE ); if( bp->image_name == NULL || bp->mod_name == NULL ) { if( image == NULL ) { if( ReMapAddress( &bp->loc ) ) { rc = REMAP_REMAPPED; } else { rc = REMAP_ERROR; } } else { rc = ReMapImageAddress( &bp->loc, image ); } } else { himage = LookupImageName( bp->image_name, strlen( bp->image_name ) ); if( himage == NO_MOD ) return( REMAP_ERROR ); mod = LookupModName( himage, bp->mod_name, strlen( bp->mod_name ) ); if( mod == NO_MOD ) return( REMAP_ERROR ); ok = GetBPSymAddr( bp, &addr ); if( !ok ) return( REMAP_ERROR ); if( bp->cue_diff != 0 ) { if( DeAliasAddrCue( mod, addr, ch ) != SR_EXACT ) return( REMAP_ERROR ); if( LineCue( mod, CueFileId( ch ), CueLine( ch ) + bp->cue_diff, 0, ch2 ) != SR_EXACT ) return( REMAP_ERROR ); addr = CueAddr( ch2 ); } if( bp->addr_diff != 0 ) { addr.mach.offset += bp->addr_diff; } bp->loc.addr = addr; rc = REMAP_REMAPPED; } if( rc == REMAP_REMAPPED ) { bp->status.b.unmapped = false; } SetPointAddr( bp, bp->loc.addr ); if( bp->status.b.activate_on_remap ) { ActPoint( bp, true ); } return( rc ); }
static void DumpSource( void ) { char buff[256]; DIPHDL( cue, ch ); if( _IsOn( SW_TASK_RUNNING ) ) { printf( "I don't know where the task is. It's running\n" ); } if( DeAliasAddrCue( NO_MOD, GetCodeDot(), ch ) == SR_NONE || !DUIGetSourceLine( ch, buff, sizeof( buff ) ) ) { UnAsm( GetCodeDot(), buff, sizeof( buff ) ); } printf( "%s\n", buff ); }
static void RepInitEv( event_record *ev ) { DIPHDL( cue, ch ); if( ev->cue == NULL ) { if( DeAliasAddrCue( NO_MOD, ev->ip, ch ) != SR_NONE ) { ev->cue = CopySourceLine( ch ); } if( ev->cue == NULL ) { UnAsm( ev->ip, TxtBuff, TXT_LEN ); ev->cue = DupStr( TxtBuff ); } } if( ev->addr_string == NULL ) { ev->addr_string = DupStr( GetEventAddress( ev ) ); } }
brkp *FindBreakByLine( mod_handle mod, cue_fileid id, unsigned line ) { brkp *bp; mod_handle brk_mod; DIPHDL( cue, ch ); for( bp = BrkList; bp != NULL; bp = bp->next ) { if( DeAliasAddrMod( bp->loc.addr, &brk_mod ) == SR_NONE )continue; if( brk_mod != mod )continue; if( DeAliasAddrCue( brk_mod, bp->loc.addr, ch ) == SR_NONE ) continue; if( CueFileId( ch ) != id ) continue; if( CueLine( ch ) != line ) continue; return( bp ); } return( NULL ); }
char *LineAddr( address *addr, char *buff, size_t buff_len ) { mod_handle mod; char *end; DIPHDL( cue, line ); AddrFloat( addr ); if( DeAliasAddrMod( *addr, &mod ) == SR_NONE ) return( NULL ); if( DeAliasAddrCue( mod, *addr, line ) == SR_NONE ) return( NULL ); end = buff + buff_len; buff += DIPModName( mod, buff, buff_len - 1 ); *buff++ = '@'; buff = CnvULongDec( DIPCueLine( line ), buff, end - buff ); *buff = NULLCHAR; return( buff ); }
void SetPointAddr( brkp *bp, address addr ) { DIPHDL( cue, ch ); image_entry *image; mod_handle mod; char const *start; bool ok; if( bp->status.b.unmapped ) return; _Free( bp->source_line ); bp->source_line = NULL; bp->loc.addr = addr; _Free( bp->mod_name ); bp->mod_name = NULL; _Free( bp->image_name ); bp->image_name = NULL; _Free( bp->sym_name ); bp->sym_name = NULL; bp->cue_diff = 0; bp->addr_diff = 0; if( !IS_BP_EXECUTE( bp->th ) ) { GetWPVal( bp ); } else if( DeAliasAddrMod( addr, &mod ) != SR_NONE ) { image = ImageEntry( mod ); if( image == NULL ) return; ModName( mod, TxtBuff, TXT_LEN ); bp->mod_name = DupStr( TxtBuff ); if( image->image_name != NULL ) { start = SkipPathInfo( image->image_name, OP_REMOTE ); bp->image_name = DupStrLen( start, ExtPointer( start, OP_REMOTE ) - start ); } else { bp->image_name = NULL; } switch( DeAliasAddrCue( NO_MOD, addr, ch ) ) { case SR_EXACT: bp->source_line = CopySourceLine( ch ); Format( TxtBuff, "%d", CueLine( ch ) ); bp->sym_name = DupStr( TxtBuff ); ok = GetBPSymAddr( bp, &addr ); break; case SR_CLOSEST: Format( TxtBuff, "%d", CueLine( ch ) ); bp->sym_name = DupStr( TxtBuff ); bp->addr_diff = addr.mach.offset - CueAddr( ch ).mach.offset; ok = GetBPSymAddr( bp, &addr ); break; default: ok = false; } if( !ok ) { _Free( bp->image_name ); _Free( bp->mod_name ); _Free( bp->sym_name ); bp->image_name = NULL; bp->mod_name = NULL; bp->sym_name = NULL; } } }