static void RegModify( a_window *wnd, int row, int piece ) { int i; item_mach value; reg_window *reg = WndReg( wnd ); bool ok; mad_radix old_radix; reg_display_piece disp; mad_type_info tinfo; mad_modify_list const *possible; int num_possible; if( row < 0 ) return; piece >>= 1; i = GetRegIdx( reg, row, piece ); if( i == -1 ) return; if( !GetDisplayPiece( &disp, reg, DbgRegs, i ) ) return; if( disp.reginfo == NULL ) return; if( MADRegSetDisplayModify( reg->data, disp.reginfo, &possible, &num_possible ) != MS_OK ) return; old_radix = NewCurrRadix( MADTypePreferredRadix( disp.disp_type ) ); MADRegFullName( disp.reginfo, ".", TxtBuff, TXT_LEN ); RegValue( &value, disp.reginfo, DbgRegs ); if( num_possible == 1 ) { ok = DlgMadTypeExpr( TxtBuff, &value, disp.disp_type ); if( ok ) { RegNewValue( disp.reginfo, &value, possible->type ); } } else { for( i = 0; i < num_possible; ++i ) { MADTypeInfo( possible[i].type, &tinfo ); if( memcmp( &value, possible[i].data, tinfo.b.bits / BITS_PER_BYTE ) == 0 ) { break; } } if( num_possible == 2 ) { if( i == 0 ) { i = 1; } else { i = 0; } } else { //MJC const cast i = DlgPickWithRtn( TxtBuff, possible, i, RegValueName, num_possible ); } if( i != -1 ) { RegNewValue( disp.reginfo, possible[i].data, possible[i].type ); } } NewCurrRadix( old_radix ); }
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 RegMenuItem( a_window *wnd, gui_ctl_id id, int row, int piece ) { reg_window *reg = WndReg( wnd ); int i; unsigned bit; mad_modify_list const *possible; int num_possible; address addr; bool valid_reg; i = GetRegIdx( reg, row, piece >>1 ); switch( id ) { case MENU_INITIALIZE: valid_reg = i != -1 && reg->info[i].info != NULL && MADRegSetDisplayModify( reg->data, reg->info[i].info, &possible, &num_possible ) == MS_OK; WndMenuEnable( wnd, MENU_REGISTER_MODIFY, valid_reg ); WndMenuEnable( wnd, MENU_REGISTER_INSPECT, valid_reg ); bit = MADRegSetDisplayToggle( reg->data, 0, 0 ); for( i = 0; i < reg->num_toggles; ++i ) { WndMenuCheck( wnd, MENU_REGISTER_TOGGLES + i, ( bit & 1 ) != 0 ); bit >>= 1; } break; case MENU_REGISTER_INSPECT: if( MADRegInspectAddr( reg->info[i].info, &DbgRegs->mr, &addr ) == MS_OK ) { PushAddr( addr ); WndInspectExprSP( "" ); } break; case MENU_REGISTER_MODIFY: RegModify( wnd, row, piece ); break; default: bit = 1 << ( id - MENU_REGISTER_TOGGLES ); MADRegSetDisplayToggle( reg->data, bit, bit ); RegResize( wnd ); WndZapped( wnd ); } }