type long = array[0..3] of byte; {defines the fake-longint type} string8 = string[8]; {translate the significant portion of a real into a long var} procedure real2long(r:real; var l:long; var e:boolean); type string8 = string[8]; string32 = string[32]; var s : string32; function power(b:real; x:integer; var e:boolean): real; begin if b > 0 then power:= exp(x * ln(b)) else halt; end; {translate the significant portion of a real into a binary string32} procedure intreal2binstr(r:real; var s:string32; var e:boolean); var i : integer; m : real; p : real; begin e:= false; if (r > power(2,32,e)-1) then begin e:= true; exit; end; s:= ''; for i:= 31 downto 1 do begin p:= power(2,i,e); m:= int(r/p); r:= r - (m * p); if (int(m) = 0) then s:= s + '0' else s:= s + '1'; end; m:= int(r); r:= r - m; if (int(m) = 0) then s:= s + '0' else s:= s + '1'; end; {translate a binary string32 into a long variable} procedure binstr2long(s: string32; var l:long; var e:boolean); var i : integer; w : string[8]; b : byte; {translate a binary string8 into a byte} procedure binstr2byte(s:string8; var y:byte; var e:boolean); var i : integer; v : integer; c : integer; b : byte; begin y:= 0; for i:= 1 to 8 do begin val(s[i],v,c); e:= not(c = 0); if e then exit; b:= v * trunc(power(2,(8-i),e)); y:= y or b; end; end; begin {binstr2long} for i:= 0 to 3 do begin w:= copy(s,(i*8)+1,8); binstr2byte(w,b,e); l[3 - i]:= b; end; end; begin {real2long} intreal2binstr(r,s,e); if e then exit; binstr2long(s,l,e); if e then exit; end; {translate a string8 (a number in hex notation) into a long variable} procedure str2long(s:string8; var l:long; var e: boolean); var i : integer; c : integer; v : integer; sb : array[0..3] of string[3]; begin for i:= 0 to 3 do begin sb[i]:= '$' + copy(s,(7-(i*2)),2); val(sb[i],v,c); e:= not(c = 0); if e then exit; l[i]:= v; end; end; {translate an integer into a long variable} procedure int2long(i:integer; var l: long); begin fillchar(l,sizeof(l),0); move(i,l,2); end; {"shr 8" for long variables} procedure shr8(var a,b: long); var i : integer; begin for i:= 0 to 2 do b[i]:= a[(i+1)]; b[3]:= 0; end; {"xor" for long variables} procedure xorl(var a,b,c : long); var i : integer; begin for i:= 0 to 3 do c[i]:= a[i] xor b[i]; end; {"and" for long variables} procedure andl(var a,b,c : long); var i : integer; begin for i:= 0 to 3 do c[i]:= a[i] and b[i]; end; BEGIN END.