Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > изменить значение одного бита регистра


Автор: gonzales 17.6.2006, 15:20
Доброе время суток

есть у меня вот такая функция для записи значения в порт (например $1b5)

мне нужно поменять один бит (7) данного регистра

WriteDWord($1b5; 0, $00000080); - вот так, не получается, не могу понять, как это сделать???





Код

procedure TCustomPCICard.WriteDWord(Offset: WORD; dan, Mask: DWORD);
var
    hwParam          :TDSDrvParam;
    dwReturnedLength :DWORD;
    dwValue          :dWORD;
    dwStatus         :DWORD;

begin
    dwValue:=ReadWord(Offset);
    dwValue:=(dwValue and (not Mask)) or (dan and  Mask);
    hwParam.dwAddress := m_MemoryBase + Offset;
    hwParam.dwValue:=dwValue;
    dwStatus := SendCommand(DWORD(IOCTL_DSDRV_WRITEMEMORYDWORD),
                                            @hwParam,
                                            sizeof(hwParam),
                                            nil,
                                            0,
                                            nil);
    if dwStatus<> ERROR_SUCCESS then
    LOG(1, 'WriteMemoryDWORD failed 0x%x', [dwStatus]);
end;
 

Автор: Демо 17.6.2006, 17:20
Код

function SetBit(Src:DWORD; BitNum:Byte; Setting:Byte=1):DWORD;
const
    Mask = $00000001;
begin
  if Setting = 0 
  then Result := Src and not(1 shl BitNum)
  else Result := Src or (Mask shl BitNum);
end;
 

Автор: Mechanic 18.6.2006, 19:00
Цитата(gonzales @  17.6.2006,  15:20 Найти цитируемый пост)
dwValue:=(dwValue and (not Mask)) or (dan and  Mask);

У тебя 0 получается при dan = 0.
Надо бы так
Код

WriteDWord($1b5; $80, $00000080);
//или WriteDWord($1b5; $FFFFFFFF, $00000080);  - результат одинаковый


А вообще, если не ты этот порт инитил, то для того, чтоб изменить только бит в нём, то сперва значение нужно прочитать, потом к нему добавить нужный бит (или сбросить его), и только потом писать обратно.

Дело усложняется ещё тем, что многие порты не читаются по тому же адресу, что и пишутся. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)