static void getRegSetInfo( mad_reg_set_data *data, mad_registers *regs, int *max_len, int *mv, int *num_reg) { unsigned i; unsigned maxd; unsigned maxv; const char *descript; unsigned max_descript; const mad_reg_info *rinfo; unsigned temp_maxv; mad_type_handle mtype; maxd = 0; maxv = 0; for( i = 0;; i++ ) { if( MADRegSetDisplayGetPiece( data, regs, i, &descript, &max_descript, &rinfo, &mtype, &temp_maxv ) != MS_OK ) { break; } if( temp_maxv == 0 && rinfo != NULL ) { temp_maxv = getMADMaxFormatWidth( mtype ); } if( max_descript == 0 && descript != NULL ) { max_descript = strlen( descript ); } if( maxd < max_descript ) maxd = max_descript; if( maxv < temp_maxv ) { maxv = temp_maxv; } } *max_len = maxd + maxv + 2; *num_reg = i; *mv = maxv + 1; }
static void GetNewRegValue( HWND hwnd ) { HWND owner; DLGPROC fp; INT_PTR reg_modified; RegModifyData modify_data; const char *descript; unsigned max_descript; mad_type_info tinfo; mad_registers *regs; owner = GetParent( hwnd ); regs = RegListGetMadRegisters( owner ); modify_data.reg_set = RegListGetMadRegSetData( owner ); owner = GetParent( owner ); MADRegSetDisplayGetPiece( modify_data.reg_set, regs, GetDlgCtrlID( hwnd ), &descript, &max_descript, (const mad_reg_info **) (&( modify_data.curr_info )), &( modify_data.th ), &( modify_data.maxv ) ); MADTypeInfo( modify_data.curr_info->type, &tinfo ); modify_data.curr_value = alloca( tinfo.b.bits / BITS_PER_BYTE ); BitGet( modify_data.curr_value, (unsigned char *)regs, modify_data.curr_info->bit_start, modify_data.curr_info->bit_size); MADRegSetDisplayModify( modify_data.reg_set, modify_data.curr_info, (const mad_modify_list **)( &( modify_data.m_list ) ), &(modify_data.num_possible) ); switch( modify_data.num_possible ) { case 2: if( memcmp( modify_data.curr_value, modify_data.m_list[0].data, tinfo.b.bits / BITS_PER_BYTE ) == 0 ){ memcpy( modify_data.curr_value, modify_data.m_list[1].data, tinfo.b.bits / BITS_PER_BYTE ); }else { memcpy( modify_data.curr_value, modify_data.m_list[0].data, tinfo.b.bits / BITS_PER_BYTE ); } reg_modified = 1; break; case 1: fp = (DLGPROC)MakeProcInstance( ChangeRegisterDialog, Instance ); reg_modified = JDialogBoxParam( Instance, "CHANGE_REG_EDIT", owner, fp, (LPARAM)( &modify_data ) ); FreeProcInstance( fp ); break; default: fp = (DLGPROC)MakeProcInstance( ChangeRegisterDialog, Instance ); reg_modified = JDialogBoxParam( Instance, "CHANGE_REG_COMBO", owner, fp, (LPARAM)( &modify_data ) ); FreeProcInstance( fp ); } if( reg_modified == 1 ) { MADRegUpdateStart( regs, modify_data.curr_info->flags, modify_data.curr_info->bit_start, modify_data.curr_info->bit_size ); BitPut( (unsigned char *)regs, modify_data.curr_info->bit_start, modify_data.curr_value, modify_data.curr_info->bit_size ); MADRegUpdateEnd( regs, modify_data.curr_info->flags, modify_data.curr_info->bit_start, modify_data.curr_info->bit_size ); } }
static void getMadString( mad_reg_set_data *data, mad_registers *regs, int i, RegStringCreateData *create ) { mad_type_handle mtype; mad_type_info mti; mad_radix radix; const mad_reg_info *rinfo; void *value; unsigned max_len; const char *descript; MADRegSetDisplayGetPiece( data, regs, i, &descript, &( create[i].maxd ), &rinfo, &mtype, &( create[i].length ) ); if ( create[i].maxd == 0 && descript != NULL ){ create[i].maxd = strlen( descript ); } if ( descript != NULL && IsEmptyString( descript ) == FALSE ){ strcpy( create[i].buffer, descript ); create[i].maxd ++; } else { create[i].buffer[0] = '\0'; create[i].maxd = 0; } if( create[i].length == 0 && rinfo != NULL ) { create[i].length = getMADMaxFormatWidth(mtype); } if( rinfo != NULL ) { MADTypeInfo( rinfo->type, &mti ); value = alloca( BITS2BYTES( mti.b.bits ) ); BitGet( value, (unsigned char *)regs, rinfo->bit_start, rinfo->bit_size ); radix = MADTypePreferredRadix( mtype ); max_len = create[i].length + 1; MADTypeHandleToString( radix, mtype, value, create[i].value, &max_len ); } else { create[i].value[0] = '\0'; } }
static bool GetDisplayPiece( reg_display_piece *disp, reg_window *reg, machine_state *mach, int i ) { return( MADRegSetDisplayGetPiece( reg->data, &mach->mr, i, &disp->descript, &disp->max_descript, &disp->reginfo, &disp->disp_type, &disp->max_value ) == MS_OK ); }