Category : Files from Magazines
Archive   : VOL7N15.ZIP
Filename : CONVERTR.PAS

 
Output of file : CONVERTR.PAS contained in archive : VOL7N15.ZIP
{$R+}
PROGRAM convertr;
{Demonstrates conversion of Turbo and Turbo-87 real numbers
or vice versa using rfrom6 and rfrom8}

TYPE
buff6 = ARRAY[0..5] OF Byte;
buff8 = ARRAY[0..7] OF Byte;
str80 = STRING[80];
VAR
sourcelength, destlength,
i, ActualRead : Integer;
sourcename, destname : str80;
print : Char;
r : Real;
fi, fo : FILE;
is87 : Boolean;
buffer6 : ARRAY[1..1000] OF buff6;
buffer8 : ARRAY[1..1000] OF buff8;

PROCEDURE rfrom6(bufferin : buff6; VAR bufferout : buff8);
VAR
i, ex : Integer;
BEGIN
FillChar(bufferout, 8, 0);

{if number=0 then exit}
IF bufferin[0] = 0 THEN Exit;

{change to 8087 offset (-129+1023) and reposition for 8087}
ex := (bufferin[0]+894) SHL 4;
{move the sign bit and hi part of exponent}
bufferout[7] := Lo((bufferin[5] AND 128) OR Hi(ex));

{move the lo part of exponent and part of mantissa}
bufferout[6] := Lo(Lo(ex) OR (bufferin[5] SHR 3 AND 15));

FOR i := 5 DOWNTO 2 DO
bufferout[i] := Lo((bufferin[i] SHL 5) OR (bufferin[i-1] SHR 3));

bufferout[1] := Lo((bufferin[1] SHL 5) {or 8} );
END;

PROCEDURE rfrom8(bufferin : buff8; VAR bufferout : buff6);
VAR
i, ex : Integer;
BEGIN
FillChar(bufferout, 6, 0);

ex := ((bufferin[7] AND 127) SHL 4) OR (bufferin[6] SHR 4);
{if exponent is 0, number is 0}
IF ex = 0 THEN Exit;

{change to turbo offset (-1023+129), deal with out of range numbers}
ex := ex-894;
IF ex < 1 THEN Exit;
IF ex >= 255 THEN
BEGIN
r := 1e37;
Exit;
END;
bufferout[0] := Lo(ex);

{move the sign bit and part of mantissa}
bufferout[5] := Lo((bufferin[7] AND 128) OR (bufferin[6] AND 15 SHL 3)
OR (bufferin[5] SHR 5));

FOR i := 4 DOWNTO 1 DO
bufferout[i] := Lo((bufferin[i+1] SHL 3) OR (bufferin[i] SHR 5));
END;

PROCEDURE CheckVersion;
BEGIN
CASE SizeOf(Real) OF
6 : Is87 := False;
8 : Is87 := True;
10 : BEGIN
WriteLn('You cannot use this procedure with TURBOBCD');
Halt;
END;
END;
END;

BEGIN
ClrScr;
CheckVersion;
WriteLn('CONVERTR creates files with 8 byte real numbers from files with');
WriteLn('6 byte real numbers, or vice versa.');
WriteLn;
IF Is87 THEN WriteLn('You are running TURBO-87,COM')
ELSE WriteLn('You are running plain TURBO.COM');
WriteLn;
REPEAT
Write('Does the source file have 6 or 8 byte real numbers? ');
ReadLn(sourcelength);
UNTIL sourceLength IN [6, 8];
IF sourcelength = 6 THEN destlength := 8 ELSE destlength := 6;

Write('Source file name? '); ReadLn(sourcename);
Write('Destination file name? '); ReadLn(destname);

Write('Display all real numbers on screen (y/n)? ');
ReadLn(print);
print := UpCase(print);

Assign(fi, sourcename); Reset(fi, sourcelength);
Assign(fo, destname); Rewrite(fo, destlength);

REPEAT
IF sourcelength = 6 THEN
BEGIN
BlockRead(fi, buffer6, 1000, ActualRead);
FOR i := 1 TO ActualRead DO rfrom6(buffer6[i], buffer8[i]);
BlockWrite(fo, buffer8, ActualRead);
END
ELSE
BEGIN
BlockRead(fi, buffer8, 1000, ActualRead);
FOR i := 1 TO ActualRead DO rfrom8(buffer8[i], buffer6[i]);
BlockWrite(fo, buffer6, ActualRead);
END;
IF print = 'Y' THEN
FOR i := 1 TO ActualRead DO
BEGIN
IF Is87 THEN Move(buffer8[i], r, 8)
ELSE Move(buffer6[i], r, 6);
WriteLn(r);
END;
UNTIL ActualRead = 0;
Close(fi);
Close(fo);
END.



  3 Responses to “Category : Files from Magazines
Archive   : VOL7N15.ZIP
Filename : CONVERTR.PAS

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/