program Morse;                { invented and programmed by Markus Birth }
uses Crt, Logo;               { those units are within our game }

type MorseData=record         { I'm trying to make it easier }
       Symbol:String;
       Code:String;
     end;

var Char2Morse: string;       { Where do all the Datas live? }
    MorseCode: string;
    f: text;
    Mors:array[0..100] of MorseData;
    i, j: integer;
    SingleC: string;
    Codes: integer;


const SDelay = 50;           { How fast R U ? }
      LDelay = 200;
      MTone  = 1200;
      Pause  = 50;
      CDelay = 200;
      WDelay = 3*CDelay;

procedure ReadData;           { What the hell is a 'Morsecode'?? }
  begin
    Assign(f, 'morse.dat');
    Reset(f);
    for i:=1 to 3 do ReadLn(f);
    ReadLn(f, Codes);
    Codes := Codes-1;
    for i:=0 to Codes do begin
      ReadLn(f, Mors[i].Symbol);
      ReadLn(f, Mors[i].Code);
      if Eof(f) then break;
    end;
    close(f);
  end;

function MorseSeek(Buch: string): string;
  begin
    for i:=0 to Codes do
      if Mors[i].Symbol=Buch then MorseSeek := Mors[i].Code;
    if Buch='' then MorseSeek := ''
  end;

procedure MorseIt(MC: string);
  var MTemp: string;
  begin
    if MC='' then exit;
    for i:=1 to length(MC) do begin
      MTemp := Copy(MC, i, 1);
      if MTemp = '.' then begin
        Sound(MTone);
        Delay(SDelay);
        NoSound;
      end;
      if MTemp = '-' then begin
        Sound(MTone);
        Delay(LDelay);
        NoSound;
      end;
      Write(MTemp);
      Delay(Pause);
    end;
    Delay(CDelay);
    WriteLn;
  end;

procedure ConvUpCase;
  begin
    for i:=1 to Length(Char2Morse) do
      Char2Morse[i] := UpCase(Char2Morse[i]);
  end;

begin                         { Come get some! Let's rock. }
  ClrScr;
  WriteLogo;
  TextColor(15);
  WriteLn('wrote another nice little program');
  TextColor(14);
  WriteLn('-=�� Morse ��=-');
  ReadData;
  WriteLn;
  TextColor(7);
  WriteLn('Press any key to continue ...');
  ReadKey;
  ClrScr;
  TextColor(15);
  WriteLn('Enter any text! To Exit just press return.');
  ReadLn(Char2Morse);
  ConvUpCase;
  for j:=1 to Length(Char2Morse) do begin
    SingleC := Copy(Char2Morse, j, 1);
    MorseCode := MorseSeek(SingleC);
    if SingleC = ' ' then begin
      Delay(WDelay);
      WriteLn;
    end
    else MorseIt(MorseCode);
  end;
  WriteLn;
  WriteLn('Exiting...');
end.