'{$STAMP BS2} ' program demo calculates dewpoint from temperature and humidity ' from values entered at the keyboard. ' (C) 2002 Tracy Allen, tracy@emesystems.com degC var word ' degrees Celsius (* 10 for dewpoint calculation) RH var word ' % relative humidity (* 10 ditto) logEW var word ' log base 10 of saturation water vapor pressure at degC DP var word ' dew point degrees Celsius ix var nib ' index for loops wx var word ' temporary variable wy var word ' temporary variable wz var word ' temporary variable wj var word ' temporary variable for integer part sign var bit ' sign for calculations bt var bit ' bit variable for calculations baud con $54 ' $f0 for sx, $54 for BS2 <---- SET FOR YOUR STAMP! top: debug cr,cr,"Enter xx degrees Celsius temperature: " serin 16,$f0,[dec2 degC] debug cr,"Enter xx % relative humidity: " serin 16,$f0,[dec2 RH] debug cr,32,?degC,32,?RH degC=degC*10 ' calculation works on temperature * 10 RH=RH*10 min 1 ' & %RH * 10 gosub getdewpoint debug " dpC=",rep "-"\sign,dec abs DP/10,".",dec1 abs DP,cr goto top getdewPoint: ' enter with -400 wj + (wz/65536) wx=-sign^(wj*10000+(wz**10000))+sign ' convert to decimal x.xxxx * 10000 & extend sign logEW=wx+logEW wx=RH gosub log2 ' find (log base 2 of wx) => wj + (wz/32768) wx=(wj*4000**49321)+(wz**6021) ' convert base 10, x.xxxx * 10000 logEW=wx+logEW-30000 ' -30000, because RH is 0->1000 ' range of logEW: ' maximum at +100 degrees C, 100%RH, where logEW=+28843 (+2.8843) ' minimum at -40 degrees C, 1%RH, where logEW=-28598 (-2.8598) ' calculate logEW/4 (so divisor in divide below will be <32768) sign=logEW.bit15 logEW=-sign^(abs logEW+2/4)+sign ' logEW/4, sign extended wx=1652-logEW ' dividend (from Magnus, 6608/4=>1552) sign=~wx.bit15 ' for dewpoint calculation, DP sign is opposite of wx wx=abs wx wy=20402-logEW ' divisor (from Magnus, 81608/4=>20402 gosub divide ' this a always a proper fraction, no integer part DP=23730**wz+5/10 ' fractional multiply, note extra decimal place and roundoff DP=-sign^DP+sign ' extend sign return divide: ' enter with wx and wy positive integers to divide wj=wx/wy ' integer part of result for ix=15 to 0 wx=wx//wy<<1 wz.bit0(ix)=wx/wy next return ' wz to be fractional part (as wz/65536 implied) log2: ' enter with wx, to find log base 2 wj=ncd wx - 1 ' integer part of result (characteristic, 0<=wb<=15) wx=wx<<(15-wj) ' left justify the operand wz=0 for ix=14 to 0 wy=wx**wx wz.bit0(ix)=wy.bit15 bt=~wy.bit15 wx=wy<