Анализируя статью
http://www.xard.ru/post/10920/default.asp попытался сделать информацию о скорости вращения кулеров, но столкнулся с проблемой-неправильным результатом при вычислениях. Вот код на си:
Код:
int getRPM(int FanNum)
{ int divisor, FanCount, counter;
divisor = ListenPort(0x0B);
if (FanNum == 1)
{divisor = divisor & 0x07;
FanCount = ListenPort(0x0D);}
else {
if (FanNum == 2)
{divisor = (divisor & 0x38) >> 3;
FanCount = ListenPort(0x0E);}
else {
if (FanNum == 3)
{divisor = divisor & 0x40;
FanCount = ListenPort(0x0F);}}}
if (divisor == 0)
{counter = 1;
if (FanNum == 3) counter = 2;}
else {
if (divisor == 1)
{counter = 2;}
else {
if (divisor == 2)
{counter = 4;}
else {
if (divisor == 3)
{counter = 8;}
else {
if (divisor == 4)
{counter = 16;}
else {
if (divisor == 5)
{counter = 32;}
else {
if (divisor == 6)
{counter = 64;}
else {
if (divisor == 7)
{counter = 128;}
else {
if (divisor == 64)
{counter = 8;}}}}}}}}}
if (FanCount == -1 || FanCount == 0)
{return 0;}
else return 1350000/(counter*FanCount);
}
Вот мой перевод на delphi:
Код:
function getFan(FanNum:integer):extended;
var divisor, FanCount, counter:integer;
begin
divisor:=0;FanCount:=0;counter:=0;
divisor:=ListenPort($0B);
if FanNum=1 then
begin
divisor:=divisor and ListenPort($07);
FanCount:=ListenPort($0D);
end
else
if FanNum=2 then
begin
divisor:=(divisor and ListenPort($38)) shr 3;
FanCount:= ListenPort($0E);
end
else
if FanNum=3 then
begin
divisor:= divisor and ListenPort($40);
FanCount:= ListenPort($0F);
end;
if divisor=0 then
begin
counter:= 1;
if (FanNum=3) then counter:= 2;
end
else
if divisor=1 then counter:=2
else
if divisor=2 then counter:=4
else
if divisor=3 then counter:=8
else
if divisor=4 then counter:=16
else
if divisor=5 then counter:=32
else
if divisor=6 then counter:=64
else
if divisor=7 then counter:=128
else
if divisor=64 then counter:=8;
if (FanCount=-1) or (FanCount=0) then
Result:=0
else
Result:=1350000/(counter*FanCount);
end;
Может кто знает в чем дело?
Выдает по 22500, 540000 RPM, в действительности же Аида выдает ~2450