Всё получилось. Спасибо!!!
вот на LUA скрипты для преобразования real в два байта и обратно:
Код:
function PackIEEE754(number) -- преобразование обычного числа в Real-pixel ( два байта i1-по адресу, i2-следующий)
local b1, b2, b3, b4
local i1,i2
if number == 0 then
return 0,0
elseif number ~= number then
return 0xFFFF, 0xFFFF
else
local sign = 0x00
if number < 0 then
sign = 0x80
number = -number
end
local mantissa, exponent = math.frexp(number)
exponent = exponent + 0x7F
if exponent <= 0 then
mantissa = math.ldexp(mantissa, exponent - 1)
exponent = 0
elseif exponent > 0 then
if exponent >= 0xFF then
return string.char(sign + 0x7F, 0x80, 0x00, 0x00)
elseif exponent == 1 then
exponent = 0
else
mantissa = mantissa * 2 - 1
exponent = exponent - 1
end
end
mantissa = math.floor(math.ldexp(mantissa, 23) + 0.5)
b1=sign + math.floor(exponent / 2)
b2=(exponent % 2) * 0x80 + math.floor(mantissa / 0x10000)
b3=math.floor(mantissa / 0x100) % 0x100
b4=mantissa % 0x100
i2 = b1 * 256 + b2
i1 = b3 * 256 + b4
return i1,i2
end
end
print(PackIEEE754(20)) -- напечатает 0 16800
function UnpackIEEE754(i1,i2) -- преобразование Real-pixel( два байта i1-по адресу, i2-следующий) в число
local b1, b2, b3, b4
b1 = math.floor(i2 / 256)
b2 = i2 - b1*256
b3 = math.floor(i1 / 256)
b4 = i1 - b3*256
local exponent = (b1 % 0x80) * 0x02 + math.floor(b2 / 0x80)
local mantissa = math.ldexp(((b2 % 0x80) * 0x100 + b3) * 0x100 + b4, -23)
if exponent == 0xFF then
if mantissa > 0 then
return 0 / 0
else
mantissa = math.huge
exponent = 0x7F
end
elseif exponent > 0 then
mantissa = mantissa + 1
else
exponent = exponent + 1
end
if b1 >= 0x80 then
mantissa = -mantissa
end
return math.ldexp(mantissa, exponent - 0x7F)
end
print(UnpackIEEE754(0,16800)) --напечатает 20
скрипты можно тестировать на
http://www.lua.org/cgi-bin/demo
ps: получится ли изменить уставку t при записи в регистр pixel var0=a400#real#SCi_Уставка_t (меня смущает что это разные регистры с var22=a03f#real#SCo_Уставка_t)?
и ещё получится ли менять скорость вентилятора (хочется переводить вент установку в экономичный режим, например в ночное время или во время отсутствия хозяев дома)?