Metropoli BBS
VIEWER: hannu.pas MODE: TEXT (CP437)
unit Hannu;

interface
   uses
	   Graph, CRT, DOS;

	procedure Graphics;
	procedure DeleteFile (NAME		:String);
   procedure RenameFile (OLDNAME, NEWNAME    :String);
	procedure Sammuta_Kursori;
	procedure Sytyta_Kursori;
   procedure CopyFile (SOURCEFILE, TARGETFILE      :String);
   procedure Save_Screen(FILENAME    :String);
   procedure Load_Screen(FILENAME    :String);
   procedure Wait_Key;
   procedure Print (X, Y   :Integer; S    :String);
   procedure DrawLine (X, Y  :Integer; PITUUS  :Word; KULMA  :Real);
   procedure DrawLine2 (X, Y  :Integer; SADE  :Word; PITUUS  :Word; KULMA  :Real);
   procedure Lines(K1, K2   :PointType);
	procedure Empty_keybuffer;
   procedure Zeros(var S  :String; PITUUS  :Byte);
   procedure LineEnd(K    :PointType; PITUUS    :Word; KULMA   :Real;
                     var T    :PointType);
   function ReadSpecialKey                           :Integer;
	function Etaisyys (X1, Y1, X2, Y2	:Integer)	  :LongInt;
	function Upper (S		     :String)		           :String;
   function Lower (S         :String)                :String;
   function UpperCase (C     :Char)                  :Char;
   function LowerCase (C     :Char)                  :Char;
   function StrFunc (X       :Real)                  :String;
   function ValFunc (S       :String)                :Real;
   function BinStr (LUKU     :LongInt)               :String;
   function BinVal (BIN      :String)                :LongInt;
   function Name (NIMI       :String)                :String;
   function Radians (ASTEET    :Real)                :Real;
   function LineEndX(X   :Integer; PITUUS    :Word; KULMA   :Real)  :Integer;
   function LineEndY(Y   :Integer; PITUUS    :Word; KULMA   :Real)  :Integer;
   function Summa (LUKU1, LUKU2     :String)         :String;
	const
		KB_LEFT        = 1;
		KB_RIGHT       = 2;
		KB_UP          = 3;
		KB_DOWN        = 4;
		KB_ESCAPE      = 5;
		KB_TAB         = 6;
		KB_INSERT      = 7;
		KB_DELETE      = 8;
		KB_HOME        = 9;
		KB_UPLEFT		= 9;
		KB_ENDKEY      = 10;
		KB_DOWNLEFT		= 10;
		KB_PAGEUP      = 11;
		KB_UPRIGHT		= 11;
		KB_PAGEDOWN    = 12;
		KB_DOWNRIGHT	= 12;
		KB_F1          = 13;
		KB_F2          = 14;
		KB_F3          = 15;
		KB_F4          = 16;
		KB_F5          = 17;
		KB_F6          = 18;
		KB_F7          = 19;
		KB_F8          = 20;
		KB_F9          = 21;
		KB_F10         = 22;
		KB_F11         = 23;
		KB_F12         = 24;
		KB_BACKSPACE   = 25;
		KB_ENTER       = 26;
		LEFTBUTTON  = 1;
		RIGHTBUTTON = 2;
		BOTHBUTTONS = 3;
		BOTHUP      = 0;

type
   GraphX = 0 .. 639;
   GraphY = 0 .. 479;
   TextX = 1 .. 80;
   TextY = 1 .. 25;
   ColorType = 0 .. 15;
   Bit6 = 0 .. 63;
   RGB_Record = record
      RED       :Bit6;
      GREEN     :Bit6;
      BLUE      :Bit6;
   end (* record RGB_Record *);

implementation

function ReadSpecialKey   :Integer;

var
	NAPPI  :Char;
	OK     :Boolean;

begin
   NAPPI := ReadKey;
	case Ord(NAPPI) of
		27:
			begin
				ReadSpecialKey := KB_ESCAPE;
				OK := True;
			end (* 27 *);
		8:
			begin
				ReadSpecialKey := KB_BACKSPACE;
				OK := True;
			end (* 8 *);
		9:
			begin
				ReadSpecialKey := KB_TAB;
				OK := True;
			end (* 9 *);
		13:
			begin
				ReadSpecialKey := KB_ENTER;
				OK := True;
			end (* 13 *);
		0:
			begin
				NAPPI := ReadKey; 
				case Ord(NAPPI) of
					82:
						begin
							ReadSpecialKey := KB_INSERT;
							OK := True;
						end (* 82 *);
					83:
						begin
							ReadSpecialKey := KB_DELETE;
							OK := True;
						end (* 83 *);
					71:
						begin
							ReadSpecialKey := KB_HOME;
							OK := True;
						end (* 71 *);
					79:
						begin
							ReadSpecialKey := KB_ENDKEY;
							OK := True;
						end (* 79 *);
					73:
						begin
							ReadSpecialKey := KB_PAGEUP;
							OK := True;
						end (* 73 *);
					81:
						begin
							ReadSpecialKey := KB_PAGEDOWN;
							OK := True;
						end (* 81 *);
					75:
						begin
							ReadSpecialKey := KB_LEFT;
							OK := True;
						end (* 75 *);
					77:
						begin
							ReadSpecialKey := KB_RIGHT;
							OK := True;
						end (* 77 *);
					72:
						begin
							ReadSpecialKey := KB_UP;
							OK := True;
						end (* 72 *);
					80:
						begin
							ReadSpecialKey := KB_DOWN;
							OK := True;
						end (* 80 *);
					59:
						begin
							ReadSpecialKey := KB_F1;
							OK := True;
						end (* 59 *);
					60:
						begin
							ReadSpecialKey := KB_F2;
							OK := True;
						end (* 60 *);
					61:
						begin
							ReadSpecialKey := KB_F3;
							OK := True;
						end (* 61 *);
					62:
						begin
							ReadSpecialKey := KB_F4;
							OK := True;
						end (* 62 *);
					63:
						begin
							ReadSpecialKey := KB_F5;
							OK := True;
						end (* 63 *);
					64:
						begin
							ReadSpecialKey := KB_F6;
							OK := True;
						end (* 64 *);
					65:
						begin
							ReadSpecialKey := KB_F7;
							OK := True;
						end (* 65 *);
					66:
						begin
							ReadSpecialKey := KB_F8;
							OK := True;
						end (* 66 *);
					67:
						begin
							ReadSpecialKey := KB_F9;
							OK := True;
						end (* 67 *);
					68:
						begin
							ReadSpecialKey := KB_F10;
							OK := True;
						end (* 68 *);
					133:
						begin
							ReadSpecialKey := KB_F11;
							OK := True;
						end (* 133 *);
					134:
						begin
							ReadSpecialKey := KB_F12;
							OK := True;
						end (* 134 *);
				end (* case Ord(NAPPI) *);
		end (* 0 *);
	end (* case Ord(NAPPI) *);
end (* function ReadSpecialKey *);

procedure Graphics;

var
	GRAPHDRIVER :Integer;
	GRAPHMODE   :Integer;

begin
	GRAPHDRIVER := VGA;
	GRAPHMODE := VGAHi;
	InitGraph(GRAPHDRIVER, GRAPHMODE, 'C:\OHJELMAT\TP\BGI\EGAVGA.BGI');
end (* procedure Graphics *);

procedure Sammuta_Kursori;

const
	VGA10 = $3D4;

begin
	Port[VGA10+0] := 10;
	Port[VGA10+1] := 16;
end (* procedure Sammuta_Kursori *);

procedure Sytyta_Kursori;

const
	VGA10 = $3D4;

begin
	Port[VGA10+0] := 10;
	Port[VGA10+1] := 13;
end (* procedure Sytyta_Kursori *);

procedure Save_Screen(FILENAME    :String);

var
   F        :Text;
   X        :Integer;
   Y        :Integer;

begin
   Assign(F, FILENAME);
   ReWrite(F);
   for Y := 0 to 479 do begin
      for X := 0 to 319 do begin
         Write(F, Chr(GetPixel(X*2, Y)*16 + GetPixel(X*2 + 1, Y)));
      end (* for X *);
   end (* for Y *);
   Close(F);
end (* procedure Save_Screen *);

procedure Load_Screen(FILENAME    :String);

var
   F        :Text;
   X        :Integer;
   Y        :Integer;
   COLOR    :Char;

begin
   Assign(F, FILENAME);
   Reset(F);
   for Y := 0 to 479 do begin
      for X := 0 to 319 do begin
         Read(F, COLOR);
         PutPixel(X*2, Y, Ord(COLOR) div 16);
         PutPixel(X*2 + 1, Y, Ord(COLOR) mod 16);
      end (* for X *);
   end (* for Y *);
   Close(F);
end (* procedure Load_Screen *);

procedure Empty_keybuffer;

var
   CH       :Char;

begin
   while KeyPressed do begin
      CH := ReadKey;
   end (* while KeyPressed *);
end (* procedure Empty_keybuffer *);

procedure Wait_Key;

var
   CH    :Char;

begin
   Empty_Keybuffer;
   CH := ReadKey;
end (* procedure Wait_Key *);

function Etaisyys (X1, Y1, X2, Y2	:Integer)	:LongInt;

var
	X	   :Integer;
	Y     :Integer;

begin
	X := Abs (X2 - X1);
	Y := Abs (Y2 - Y1);
	Etaisyys := Round(Sqrt(X*X + Y*Y));
end (* function Etaisyys *);

function Potenssi (X, Y		:Real) 	:Real;

begin
	Potenssi := Exp(Ln(X) * Y);
end (* function Potenssi *);

function LowerCase (C    :Char)        :Char;

begin
   case Ord(C) of

      65 .. 90:
         begin
            LowerCase := Chr(Ord(C) + 32);
         end;
      142:
         begin
            LowerCase := 'ä';
         end;
      153:
         begin
            LowerCase := 'ö';
         end;
      143:
         begin
            LowerCase := 'å';
         end;
      else begin
         LowerCase := C;
      end;
   end (* case C of *);
end (* function LowerCase *);

function Upper (S		:String)		:String;

var
	I			:Integer;

begin
	for I := 1 to Length(S) do begin
		S[I] := UpperCase(S[I]);
	end (* for I *);
   Upper := S;
end (* function Upper *);

function Lower (S     :String)   :String;

var
   I        :Integer;

begin
   for I := 1 to Length(S) do begin
      S[I] := LowerCase(S[I]);
   end (* for I *);
   Lower := S;
end (* function Lower *);

procedure DeleteFile
	(NAME		:String);

var
	DIRINFO		:SearchRec;
	F				:File;

begin
	FindFirst(NAME, AnyFile - Directory, DIRINFO);
	while DOSError = 0 do begin
		Assign(F, DIRINFO.Name);
      Reset(F);
		Erase(F);
		Close(F);
		FindNext(DIRINFO);
	end;
end (* procedure DeleteFile *);

procedure RenameFile (OLDNAME, NEWNAME    :String);

var
   DIRINFO        :SearchRec;
   F              :File;

begin
   Assign(F, OLDNAME);
   Rename(F, NEWNAME);
   Close(F);
end (* procedure RenameFile *);

procedure CopyFile
   (SOURCEFILE    :String;
    TARGETFILE    :String);

var
   SOURCE      :File;
   TARGET      :File;
   NUMREAD     :Word;
   NUMWRITTEN  :Word;
   BUF         :array [1 .. 16384] of Char;

begin
   Assign(SOURCE, SOURCEFILE);
   Assign(TARGET, TARGETFILE);
   Reset(SOURCE, 1);
   ReWrite(TARGET, 1);
   if DOSError = 0 then begin
      repeat
         BlockRead(SOURCE, BUF, SizeOf(BUF), NUMREAD);
         BlockWrite(TARGET, BUF, NUMREAD, NUMWRITTEN);
      until (NUMREAD = 0) or (NUMWRITTEN <> NUMREAD);
   end (* if DOSError = 0 then begin *);
   Close(SOURCE);
   Close(TARGET);
end (* procedure CopyFile *);

procedure Print (X, Y   :Integer; S    :String);

var
   OLDX     :Integer;
   OLDY     :Integer;

begin
   OLDX := WhereX;
   OLDY := WhereY;
   GotoXY(X, Y);
   Write(S);
   GotoXY(OLDX, OLDY);
end (* procedure Print *);

function LineEndX(X   :Integer; PITUUS    :Word; KULMA   :Real)   :Integer;

var
   RADIANS        :Real;

begin
   RADIANS := KULMA/360*2*Pi;
   LineEndX := X + Round(Cos(RADIANS)*(PITUUS - 1));
end (* function LineEndX *);

function LineEndY(Y   :Integer; PITUUS    :Word; KULMA   :Real)   :Integer;

var
   RADIANS        :Real;

begin
   RADIANS := KULMA/360*2*Pi;
   LineEndY := Y - Round(Sin(RADIANS)*(PITUUS - 1));
end (* function LineEndY *);

function Radians (ASTEET    :Real)           :Real;

begin
   Radians := ASTEET/360*2*Pi;
end (* function Radians *);

procedure DrawLine (X, Y   :Integer; PITUUS  :Word; KULMA    :Real);

var
   X2      :Integer;
   Y2      :Integer;
   RADIANS :Real;

begin
   RADIANS := KULMA/360*2*Pi;
   X2 := X + Round(Cos(RADIANS)*(PITUUS - 1));
   Y2 := Y - Round(Sin(RADIANS)*(PITUUS - 1));
   Line(X, Y, X2, Y2);
end (* procedure DrawLine *);

procedure DrawLine2 (X, Y   :Integer; SADE  :Word; PITUUS  :Word; KULMA    :Real);

var
   X1      :Integer;
   Y1      :Integer;
   X2      :Integer;
   Y2      :Integer;
   RADIANS :Real;

begin
   RADIANS := KULMA/360*2*Pi;
   X1 := X + Round(Cos(RADIANS)*(SADE - 1));
   Y1 := Y - Round(Sin(RADIANS)*(SADE - 1));
   X2 := X + Round(Cos(RADIANS)*(SADE - PITUUS));
   Y2 := Y - Round(Sin(RADIANS)*(SADE - PITUUS));
   Line(X1, Y1, X2, Y2);
end (* procedure DrawLine2 *);

procedure Zeros (var S   :String; PITUUS   :Byte);

var
   I     :Byte;

begin
   for I := 1 to PITUUS - Length(S) do begin
      S := '0' + S;
   end (* for I := 1 to PITUUS - Length(S) *);
end (* procedure Zeros *);

function StrFunc (X     :Real)      :String;

var
   S     :String;

begin
   Str(X, S);
   StrFunc := S;
end (* function StrFunc *);

function ValFunc (S     :String)      :Real;

var
   V     :LongInt;
   CODE  :Integer;

begin
   Val(S, V, CODE);
   if CODE = 0 then begin
      ValFunc := V;
   end
   else begin
      ValFunc := 0;
   end (* if *);
end (* function ValFunc *);

function Summa (LUKU1, LUKU2     :String)       :String;

var
   TULOS    :String;
   MUISTI   :Integer;
   TEMP     :Integer;
   I        :Integer;

begin
   TULOS := '';
   MUISTI := 0;
   if Length(LUKU1) <> Length(LUKU2) then begin
      if Length(LUKU1) > Length(LUKU2) then begin
         Zeros(LUKU2, Length(LUKU1));
      end
      else begin
         Zeros(LUKU1, Length(LUKU2));
      end (* if *);
   end (* if Length(LUKU1) <> Length(LUKU2) *);
   for I := Length(LUKU1) downto 1 do begin
      TEMP := Round(ValFunc(Copy(LUKU1, I, 1))) +
              Round(ValFunc(Copy(LUKU2, I, 1))) + MUISTI;
      if Length(StrFunc(TEMP)) = 2 then begin
         if I > 1 then begin
            MUISTI := Round(ValFunc(Copy(StrFunc(TEMP), 1, 1)));
            TULOS := Copy(StrFunc(TEMP), 2, 1) + TULOS;
         end
         else begin
            TULOS := StrFunc(TEMP) + TULOS;
         end (* if *);
      end
      else begin
         MUISTI := 0;
         TULOS := StrFunc(TEMP) + TULOS;
      end (* if *);
   end (* for I := Length(LUKU1) downto 1 *);
   Summa := TULOS;
end (* function Summa *);

function BinStr (LUKU    :LongInt)        :String;

var
   BINAARI     :String;

begin
   BINAARI := '';
   repeat
      if LUKU mod 2 = 1 then begin
         BINAARI := '1' + BINAARI;
      end
      else begin
         BINAARI := '0' + BINAARI;
      end (* if *);
      LUKU := LUKU div 2;
   until LUKU = 0;
   BinStr := BINAARI;
end (* function BinStr *);

function BinVal (BIN      :String)     :LongInt;

var
   I        :Integer;

begin
end (* function BinVal *);

function UpperCase (C  :Char)       :Char;

begin
   case C of

      'ä':
         begin
            UpperCase := 'Ä';
         end;
      'ö':
         begin
            UpperCase := 'Ö';
         end;
      'å':
         begin
            UpperCase := 'Å';
         end;
      'Ä':
         begin
            UpperCase := 'Ä';
         end;
      'Ö':
         begin
            UpperCase := 'Ö';
         end;
      'Å':
         begin
            UpperCase := 'Å';
         end;
      else begin
         UpperCase := UpCase(C);
      end;
   end (* case C of *);
end (* function UpperCase *);

function Name (NIMI          :String)           :String;

begin
   while NIMI[1] = ' ' do begin
      Delete(NIMI, 1, 1);
   end (* while NIMI[1] = ' ' *);
end (* function Name *);

procedure LineEnd(K  :PointType; PITUUS   :Word; KULMA   :Real;
                  var T  :PointType);

begin
   T.X := LineEndX(K.X, PITUUS, KULMA);
   T.Y := LineEndY(K.Y, PITUUS, KULMA);
end (* procedure LineEnd *);

procedure Lines(K1, K2        :PointType);

begin
   Line(K1.X, K1.Y, K2.X, K2.Y);
end (* procedure Lines *);
end.
[ RETURN TO DIRECTORY ]