static byte *GetMachAddr( imp_image_handle *ii, byte *ptr, addr_ptr *addr, int is32 ) { if( is32 ) { *addr = *(addr48_ptr *)ptr; ptr += sizeof( addr48_ptr ); } else { ConvAddr32ToAddr48( *(addr32_ptr *)ptr, *addr ); ptr += sizeof( addr32_ptr ); } AddressMap( ii, addr ); return( ptr ); }
mad_status MADIMPENTRY( UnexpectedBreak )( mad_registers *mr, char *buff, size_t *buff_size_p ) { address a; union { byte b[9]; addr32_ptr a32; addr48_ptr a48; } data; size_t buff_size; size_t len; buff_size = *buff_size_p; *buff_size_p = 0; if( buff_size > 0 ) buff[0] = '\0'; a = GetRegIP( mr ); memset( &data, 0, sizeof( data ) ); MCReadMem( a, sizeof( data.b ), data.b ); if( data.b[0] != BRK_POINT ) return( MS_FAIL ); mr->x86.cpu.eip += 1; if( data.b[1] != JMP_SHORT ) return( MS_OK ); if( memcmp( data.b + 3, "WVIDEO", 6 ) != 0 ) return( MS_OK ); a = GetRegSP( mr ); MCReadMem( a, sizeof( addr_ptr ), &data ); if( BIG_SEG( a ) ) { a.mach = data.a48; } else { ConvAddr32ToAddr48( data.a32, a.mach ); } len = 0; while( MCReadMem( a, sizeof( data.b[0] ), data.b ) != 0 ) { a.mach.offset++; if( len + 1 < buff_size ) buff[len] = data.b[0]; if( data.b[0] == '\0' ) break; ++len; } *buff_size_p = len; if( buff_size > 0 ) { --buff_size; if( buff_size > len ) buff_size = len; buff[buff_size] = '\0'; } return( MS_OK ); }
mad_status DIGENTRY MIUnexpectedBreak( mad_registers *mr, unsigned *maxp, char *buff ) { address a; union { byte b[9]; addr32_ptr a32; addr48_ptr a48; } data; unsigned max; unsigned len; max = *maxp; *maxp = 0; if( max > 0 ) buff[0] = '\0'; a = GetRegIP( mr ); memset( &data, 0, sizeof( data ) ); MCReadMem( a, sizeof( data.b ), &data ); if( data.b[0] != BRK_POINT ) return( MS_FAIL ); mr->x86.cpu.eip += 1; if( data.b[1] != JMP_SHORT ) return( MS_OK ); if( memcmp( &data.b[3], "WVIDEO", 6 ) != 0 ) return( MS_OK ); a = GetRegSP( mr ); MCReadMem( a, sizeof( addr_ptr ), &data ); if( BIG_SEG( a ) ) { a.mach = data.a48; } else { ConvAddr32ToAddr48( data.a32, a.mach ); } len = 0; for( ;; ) { if( MCReadMem( a, sizeof( data.b[0] ), &data.b[0] ) == 0 ) break; a.mach.offset++; if( len < max ) buff[len] = data.b[0]; if( data.b[0] == '\0' ) break; ++len; } if( max > 0 ) buff[max] = '\0'; *maxp = len; return( MS_OK ); }
void FromItem( item_mach *tmp, stack_entry *entry ) { unsigned size; mad_type_info src_type; mad_type_info dst_type; type_info ti; if( entry->info.size > sizeof( *tmp ) ) { Error( ERR_NONE, LIT( ERR_TYPE_CONVERSION ) ); } size = entry->info.size; switch( entry->info.kind ) { case TK_BOOL: case TK_ENUM: case TK_CHAR: case TK_INTEGER: MADTypeInfo( MADTypeForDIPType( &entry->info ), &src_type ); if( (entry->info.modifier & TM_MOD_MASK) == TM_SIGNED ) { MADTypeInfoForHost( MTK_INTEGER, -(int)sizeof( entry->v.sint ), &dst_type ); } else { MADTypeInfoForHost( MTK_INTEGER, sizeof( entry->v.sint ), &dst_type ); } MADTypeConvert( &src_type, tmp, &dst_type, &entry->v.uint, 0 ); return; case TK_REAL: MADTypeInfo( MADTypeForDIPType( &entry->info ), &src_type ); MADTypeInfoForHost( MTK_FLOAT, sizeof( entry->v.real ), &dst_type ); MADTypeConvert( &src_type, tmp, &dst_type, &entry->v.real, 0 ); return; case TK_COMPLEX: ti.kind = TK_REAL; ti.size = entry->info.size / 2; ti.modifier = entry->info.modifier; MADTypeInfo( MADTypeForDIPType( &ti ), &src_type ); MADTypeInfoForHost( MTK_FLOAT, sizeof( entry->v.cmplx.re ), &dst_type ); MADTypeConvert( &src_type, tmp, &dst_type, &entry->v.cmplx.re, 0 ); MADTypeConvert( &src_type, (unsigned_8 *)tmp + ti.size, &dst_type, &entry->v.cmplx.im, 0 ); return; case TK_POINTER: case TK_ADDRESS: //NYI: use MAD conversion routines.... switch( entry->info.modifier & TM_MOD_MASK ) { case TM_NEAR: switch( size ) { case 2: entry->v.addr.mach.offset = tmp->so; return; case 8: //NYI: 64 bit offsets entry->info.size = 4; case 4: entry->v.addr.mach.offset = tmp->lo; return; } break; case TM_FAR: case TM_HUGE: switch( size ) { case 4: entry->v.addr.sect_id = 0; entry->v.addr.indirect = FALSE; ConvAddr32ToAddr48( tmp->sa, entry->v.addr.mach ); return; case 6: entry->v.addr.sect_id = 0; entry->v.addr.indirect = FALSE; entry->v.addr.mach = tmp->la; return; case sizeof( address ): /* it's an internal address symbol */ entry->v.addr = tmp->xa; entry->info.size = 6; return; } break; } break; } Error( ERR_NONE, LIT( ERR_TYPE_CONVERSION ) ); }