long AddrDiff( address a, address b ) { AddrFix( &a ); AddrFix( &b ); DeAlias( &a.mach ); DeAlias( &b.mach ); return( MADAddrDiff( &a, &b, MAF_FULL ) ); }
int SameAddrSpace( address a, address b ) { if( _IsOn( SW_IGNORE_SEGMENTS ) ) return( TRUE ); if( a.sect_id == 0 ) a.sect_id = b.sect_id; if( b.sect_id == 0 ) b.sect_id = a.sect_id; if( a.sect_id != b.sect_id ) return( FALSE ); AddrFix( &a ); AddrFix( &b ); DeAlias( &a.mach ); DeAlias( &b.mach ); return( a.mach.segment == b.mach.segment ); }
static bool ItemGet( address *addr, item_mach *item, item_type typ ) { unsigned size = Sizes[typ & IT_TYPE_MASK]; if( typ & IT_DEC ) addr->mach.offset -= size; if( typ & IT_IO ) { if( PortPeek( addr->mach.offset, item, size ) != size ) { if( typ & IT_ERR ) { Error( ERR_NONE, LIT_ENG( ERR_NO_READ_PORT ), *addr ); } return( false ); } } else { if( ProgPeek( *addr , item, size ) != size ) { if( typ & IT_ERR ) { AddrFix( addr ); Error( ERR_NONE, LIT_ENG( ERR_NO_READ_MEM ), *addr ); } return( false ); } } if( typ & IT_INC ) addr->mach.offset += size; return( true ); }
void MakeMemoryAddr( bool pops, memory_expr def_seg, address *val ) { if( ExprSP->flags & SF_LOCATION ) { ExprSP->flags &= ~(SF_LOCATION|SF_IMP_ADDR); ExprSP->v.addr = ExprSP->v.loc.e[0].u.addr; ExprSP->info.kind = TK_ADDRESS; ExprSP->info.modifier = TM_FAR; } switch( ExprSP->info.kind ) { case TK_ADDRESS: case TK_POINTER: if( (ExprSP->info.modifier & TM_MOD_MASK) != TM_NEAR ) break; /* fall through */ default: DefAddr( def_seg, val ); AddrFix( val ); //NYI: lost address abstraction PushInt( val->mach.segment ); SwapStack( 1 ); MakeAddr(); } *val = ExprSP->v.addr; AddrFloat( val ); if( pops ) PopEntry(); }
int AddrComp( address a, address b ) { if( a.sect_id == 0 ) a.sect_id = b.sect_id; if( b.sect_id == 0 ) b.sect_id = a.sect_id; if( a.sect_id > b.sect_id ) { return( 3 ); } else if( a.sect_id < b.sect_id ) { return( -3 ); } else { if( _IsOn( SW_IGNORE_SEGMENTS ) ) { return( MADAddrComp( &a, &b, MAF_OFFSET ) ); } else { AddrFix( &a ); AddrFix( &b ); DeAlias( &a.mach ); DeAlias( &b.mach ); return( MADAddrComp( &a, &b, MAF_FULL ) ); } } }
char *AddrTypeToString( address *a, mad_type_handle th, char *buff, size_t buff_len ) { mad_type_info mti; item_mach item; mad_type_info host; MADTypeInfo( th, &mti ); MADTypeInfoForHost( MTK_ADDRESS, sizeof( address ), &host ); AddrFix( a ); MADTypeConvert( &host, a, &mti, &item, 0 ); MADTypeToString( 16, &mti, &item, buff, &buff_len ); return( buff + buff_len ); }
void CnvAddrToItem( address *a, item_mach *item, mad_type_info *mti ) { //MAD: a bit ugly AddrFix( a ); switch( mti->b.bits - mti->a.seg.bits ) { case 16: item->sa.offset = a->mach.offset; item->sa.segment = a->mach.segment; break; case 32: item->la.offset = a->mach.offset; item->la.segment = a->mach.segment; break; } }
bool PerformExplicitCall( address start, mad_string ctype, unsigned num_parms ) { bool ret; stack_entry *src; address stack; unsigned align; unsigned long amount; mad_type_info mti; stack = GetRegSP(); GetMADTypeDefaultAt( stack, MTK_INTEGER, &mti ); align = mti.b.bits / BITS_PER_BYTE; for( ; num_parms != 0; --num_parms ) { if( ExprSP->v.loc.e[0].type!=LT_ADDR && ExprSP->v.loc.e[0].u.p==NULL ) { /* push item */ src = StkEntry( 1 ); amount = (src->info.size + (align-1)) & -align; if( _IsOff( SW_STACK_GROWS_UP ) ) { stack.mach.offset -= amount; } LocationCreate( &ExprSP->v.loc, LT_ADDR, &stack ); if( _IsOn( SW_STACK_GROWS_UP ) ) { stack.mach.offset += amount; } ExprSP->info = src->info; ExprSP->flags |= SF_LOCATION; ExprSP->th = NULL; } SwapStack( 1 ); DoAssign(); PopEntry(); } AddrFix( &start ); SetRegSP( stack ); MADCallBuildFrame( ctype, start, start, &DbgRegs->mr, &DbgRegs->mr ); DbgTmpBrk.loc.addr = start; NullStatus( &DbgTmpBrk ); DbgTmpBrk.status.b.active = TRUE; ret = CallRoutine(); NullStatus( &DbgTmpBrk ); return( ret ); }
void SetRegBP( address addr ) { AddrFix( &addr ); MADRegSpecialSet( MSR_FP, &DbgRegs->mr, &addr.mach ); }
void SetRegIP( address addr ) { AddrFix( &addr ); MADRegSpecialSet( MSR_IP, &DbgRegs->mr, &addr.mach ); SetStateOvlSect( DbgRegs, addr.sect_id ); }