home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 09_10 / praxis / morsenpc.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-07-12  |  17.8 KB  |  538 lines

  1. (* ------------------------------------------------------ *)
  2. (*                    MORSENPC.PAS                        *)
  3. (*      Morsezeichen senden und mit einer parallelen      *)
  4. (*         Schnittstelle oder Gamekarte empfangen         *)
  5. (*          (c) 1991 Andreas Bartels & TOOLBOX            *)
  6. (* ------------------------------------------------------ *)
  7. {$A+,B-,D-,E-,F-,I-,L-,N-,O-,R+,S-,V-,X+}
  8. PROGRAM MorsenMitPC;
  9. USES
  10.   Graph, Crt, Dos, Printer;
  11. CONST
  12.   PortNo = $379;                        { Portadresse LPT1 }
  13.   BitNo  = 4;            { Position des "Datenbits" an LPT }
  14. { Das Interface läßt sich auf verschiedene Arten           }
  15. { anschließen. Die folgende Tabelle gibt Auskunft über     }
  16. { die Portadresse, die Position des Datenbits und die      }
  17. { Pin-Nr. des Anschluß. Bitte passen Sie die Konstanten    }
  18. { "PortNo" und "BitNo" auf den Anschluß an!                }
  19. {╔═══════════════════╦═══════╤═════╤═════════════════╤════╗}
  20. {║  Schnittstelle    ║ BitNo │ Pol │ Bedeutung       │Pin ║}
  21. {╠═══════════════════╬═══════╪═════╪═════════════════╪════╣}
  22. {║ ┌──────────Port─┐ ║   3   │  -  │ Error           │ 15 ║}
  23. {║ │LPT1      0379h│ ║   4   │  +  │ Select          │ 13 ║}
  24. {║ │LPT2      0279h│ ║   5   │  +  │ Paper Out       │ 12 ║}
  25. {║ │LPT3      03BDh│ ║   6   │  +  │ Acknowledge     │ 10 ║}
  26. {║ └───────────────┘ ║   7   │  -  │ Busy            │ 11 ║}
  27. {╠═┌──────────Port─┐═╬═══════╪═════╪═════════════════╪════╣}
  28. {║ │Gamekarte 0200h│ ║   4   │  +  │ Stick 1 Feuer 1 │ 2  ║}
  29. {║ │Multi-IO: 0201h│ ║   5   │  +  │ Stick 1 Feuer 2 │ 7  ║}
  30. {║ │      bis 0207h│ ║   6   │  +  │ Stick 2 Feuer 1 │ 14 ║}
  31. {║ └───────────────┘ ║   7   │  +  │ Stick 2 Feuer 2 │ 10 ║}
  32. {╚═══════════════════╩═══════╧═════╧═════════════════╧════╝}
  33.   MaxLen = 6;                       { max. Länge Morsecode }
  34.   ZSatz : STRING[126] =    { binär codiertes Morsealphabet }
  35. { Binärcode, letzte
  36.    Dezimalstelle     :     010123012345670123456789012345
  37.    Binärcode-Länge   :     112222333333334444444444444444
  38.    Zulässige Zeichen : } 'ETIANMSURWDKGOHVF~L~PJBXCYZQ!~'
  39. {                        01234567890123456789012345678901
  40.                          55555555555555555555555555555555 }
  41.                        +'54~3~~~2~~~~~~~16=/~~~(~7~~~8~90'
  42. {                        01234567890123456789012345678901
  43.                          66666666666666666666666666666666 }
  44.                        +'~~~~~~~~~~~~?~~~~~~~~.~~~~~~~~'''
  45. {                        23456789012345678901234567890123
  46.                          66666666666666666666666666666666 }
  47.                        +'~~-~~~~~~~~;~~)~~~~~,~~~~:~~~~~~';
  48.   ZweiHoch : ARRAY[0..MaxLen] OF BYTE =
  49.              (1, 2, 4, 8, 16, 32, 64);
  50.   SoundOn  : BOOLEAN = TRUE;
  51.   GameOver : BOOLEAN = FALSE;
  52. VAR
  53.   ZProMin, Vari, MFreq, MTime, Long, Short : WORD;
  54.   EmpfProtFName, SendProtFName,
  55.   MorseFName, Kennung                      : STRING[60];
  56.   EmpfProtF, SendProtF                     : TEXT;
  57.   MorseF                                   : FILE OF CHAR;
  58.  
  59. PROCEDURE Line(y : BYTE; s : STRING);
  60. VAR n : BYTE;
  61. BEGIN
  62.   GotoXY(1, y); ClrEoL; GotoXY(10, y);
  63.   FOR n := 1 TO Length(s) DO
  64.     CASE s[n] OF
  65.       '⌐' : HighVideo;
  66.       '¬' : LowVideo;
  67.     ELSE    Write(s[n]);
  68.     END;
  69. END;  { Line }
  70.  
  71. PROCEDURE KopfZeile;
  72. BEGIN
  73.   ClrScr;
  74.   Line(1, '⌐Morsen mit PC¬   (c) 1991 Andreas'+
  75.           ' Bartels & toolbox');
  76. END;  { KopfZeile }
  77.  
  78. FUNCTION DateiExistiert(FileName : STRING) : BOOLEAN;
  79. VAR Datei : FILE;
  80. BEGIN
  81.   Assign(Datei, FileName);
  82.   {$I-} Reset( Datei ); Close( Datei ); {$I+};
  83.   DateiExistiert := (FileName <> '') AND (IOResult = 0);
  84. END;  { DateiExistiert }
  85.  
  86. PROCEDURE WaitOrKey(MS : LONGINT);
  87. VAR Key : CHAR; Time : LONGINT;
  88. BEGIN
  89.   Time := 0;
  90.   REPEAT
  91.     IF KeyPressed THEN Time := MS;
  92.     Delay(10); Inc(Time, 10);
  93.   UNTIL Time >= MS;
  94.   IF KeyPressed THEN Key := ReadKey;
  95. END;  { WaitOrKey }
  96.  
  97. PROCEDURE AcceptStr(x, y : BYTE; VAR Str : STRING);
  98. BEGIN
  99.   GotoXY(x, y); ClrEoL; ReadLn(Str);
  100. END;  { AcceptStr }
  101.  
  102. PROCEDURE AcceptNum(x, y : BYTE; VAR Num : WORD);
  103. VAR Fehler : WORD;
  104. BEGIN
  105.   GotoXY(x, y); ClrEoL;
  106.   REPEAT
  107.     {$I-} ReadLn(Num); {$I+}
  108.     Fehler := IOResult;
  109.     IF Fehler <> 0 THEN GotoXY(x, y);
  110.   UNTIL Fehler = 0;
  111. END;  { AcceptNum }
  112.  
  113. PROCEDURE ZeichenMorsen(MChar : CHAR);
  114. VAR Laenge, MCode, PosNr, n, m : BYTE;
  115. BEGIN
  116.   IF MChar IN [#97..#122] THEN    { Zeichen filtern und in }
  117.     MChar := UpCase(MChar);       { Großbuchstaben wandeln }
  118.   IF NOT(MChar IN [#32..#165]) THEN MChar := ' ';
  119.   PosNr := Pos(MChar, ZSatz);
  120.   IF PosNr = 0 THEN BEGIN    { kein entspr. Code vorhanden }
  121.     Laenge := 0; MCode  := 0;
  122.   END ELSE BEGIN
  123.     n := PosNr + 1;       { Länge des Morsecodes berechnen }
  124.     IF PosNr < 3 THEN Laenge := 1
  125.     ELSE BEGIN
  126.       Laenge := 0;
  127.       REPEAT
  128.         n := n SHR 1; Inc(Laenge);
  129.       UNTIL n < 2;
  130.     END;
  131.     n := 2; MCode := PosNr;     { Morsecode im Binärformat }
  132.     IF PosNr < 3 THEN MCode := PosNr
  133.     ELSE BEGIN
  134.       REPEAT
  135.         MCode := MCode - n; n := n SHL 1;
  136.       UNTIL n >= MCode;
  137.     END;
  138.     Dec(MCode, 1);
  139.   END;
  140.   IF Laenge = 0 THEN           { Ausgabe über Lautsprecher }
  141.     Delay(3 * MTime)                   { Pause oder Fehler }
  142.   ELSE
  143.     FOR n := 1 TO Laenge DO BEGIN
  144.       Sound(MFreq); Delay(MTime);
  145.       IF MCode AND ZweiHoch[Laenge - n] =
  146.          ZweiHoch[Laenge - n] THEN Delay(2 * MTime);
  147.       NoSound; Delay(MTime);     { Pause innerhalb Zeichen }
  148.     END;
  149.   Delay(2 * MTime);        { Pause zw. Zeichen : 3 * MTime }
  150.   Write(SendProtF, MChar);                { protokollieren }
  151.   IF WhereX > 69 THEN BEGIN                { Zeilenumbruch }
  152.     WriteLn(SendProtF); WriteLn;
  153.   END;
  154. END;  { ZeichenMorsen }
  155.  
  156. PROCEDURE SendeZeichenWeise;
  157. VAR i, x, y : BYTE; ch : CHAR;
  158. BEGIN
  159.   y := 15;
  160.   REPEAT
  161.     x := 10; GotoXY(x, y);
  162.     REPEAT
  163.       ch := ReadKey; GotoXY(x,y); Write(ch);
  164.       ZeichenMorsen(ch); Inc(x);
  165.     UNTIL (ch = #27) OR (x > 70);
  166.     IF x > 70 THEN Inc(y);
  167.   UNTIL ch = #27;
  168.   ch := 'x'; WriteLn(SendProtF);
  169. END;  { SendeZeichenWeise }
  170.  
  171. PROCEDURE SendeKennung;
  172. VAR i : BYTE; MorseCh : CHAR; MorseZeile : STRING[60];
  173. BEGIN
  174.   Line(14, 'Sende die Kennung: ' + Kennung); WriteLn;
  175.   FOR i := 1 TO Length(Kennung) DO BEGIN
  176.     Write(UpCase(Kennung[i]));
  177.     ZeichenMorsen(Kennung[i]); Delay(2 * MTime);
  178.     IF KeyPressed THEN
  179.       IF UpCase(ReadKey) = #27 THEN
  180.         i := Length(Kennung);
  181.   END;
  182.   WriteLn(' ... OK'); WaitOrKey(5000); WriteLn(SendProtF);
  183. END;  { SendeKennung }
  184.  
  185. PROCEDURE SendeDatei;
  186. VAR i : BYTE; MorseCh, ch : CHAR; MorseZeile : STRING[60];
  187. BEGIN
  188.   MorseFName := ' ';
  189.   REPEAT
  190.     Line(14, '⌐Zu sendende Datei:¬ ');
  191.     AcceptStr(30, 14, MorseFName);
  192.     IF MorseFName = ' .TXT' THEN Exit;    { ohä: vertippt! }
  193.   UNTIL DateiExistiert(MorseFName);
  194.   Assign(MorseF, MorseFName); Reset(MorseF);
  195.   MorseZeile := '';
  196.   FOR i := 1 TO 60 DO MorseZeile := MorseZeile + ' ';
  197.   REPEAT
  198.     IF NOT EoF(MorseF) THEN BEGIN
  199.       Read(MorseF, MorseCh);
  200.       CASE MorseCh OF
  201.         #30..#154 : Write(MorseCh);
  202.         #13 :       WriteLn;
  203.       END;
  204.       ZeichenMorsen(MorseCh);
  205.       IF KeyPressed THEN ch := UpCase(ReadKey);
  206.     END;
  207.   UNTIL EoF(MorseF) OR (ch = #27);
  208.   Close(MorseF); WriteLn(' ... OK');
  209.   WaitOrKey(5000); WriteLn(SendProtF);
  210. END;  { SendeDatei }
  211.  
  212. PROCEDURE SendeMenue;
  213. VAR ch : CHAR;
  214. BEGIN
  215.   IF DateiExistiert(SendProtFName) THEN BEGIN
  216.     Assign(SendProtF, SendProtFName);
  217.     Append(SendProtF);
  218.     WriteLn(SendProtF, #10#13, '  Nächster Eintrag: ');
  219.   END
  220.   ELSE BEGIN
  221.     Assign(SendProtF, SendProtFName);
  222.     ReWrite(SendProtF);
  223.     WriteLn(SendProtF, '  Erster Eintrag: ');
  224.   END;
  225.   REPEAT
  226.     KopfZeile;
  227.     Line(3, '⌐S e n d e - M e n ü');
  228.     Line(5, '⌐Sende:  ⌐K¬ennung  ⌐Z¬eichenweise  ⌐D¬atei');
  229.     Line(9, '⌐Esc¬    Hauptmenü');
  230.     ch := UpCase(ReadKey);
  231.     CASE ch OF
  232.       'K' : SendeKennung;
  233.       'Z' : SendeZeichenWeise;
  234.       'D' : SendeDatei;
  235.     END;
  236.   UNTIL ch = #27;
  237.   WriteLn(SendProtF); Close(SendProtF);
  238. END;  { SendeMenue }
  239.  
  240. FUNCTION DekodiereZeichen(SCode : STRING) : CHAR;
  241. VAR PosNr, MCode, n : BYTE; ch : CHAR;
  242. BEGIN
  243.   MCode := 0;
  244.   FOR n := 1 TO Length(SCode) DO
  245.     IF SCode[n] = '-' THEN
  246.       MCode := MCode OR ZweiHoch[Length(SCode) - n];
  247.   IF (MCode > ZweiHoch[Length(SCode)] - 1) THEN ch := '≈'
  248.   ELSE ch := ZSatz[ZweiHoch[Length(SCode)] - 1 + MCode];
  249.   NoSound; DekodiereZeichen := ch;
  250. END;  { DekodiereZeichen }
  251.  
  252. FUNCTION InputBit : BOOLEAN;           { Abfrage des Ports }
  253. VAR BitAnd : BYTE; Bit : BOOLEAN;
  254. BEGIN
  255.   BitAnd := 1 SHL BitNo;
  256. { Auswertung für Polarisation - }
  257.   Bit := (Port[PortNo] AND BitAnd > 0);
  258. { ...und für Polarisation + }
  259. { Bit := (Port[PortNo] AND BitAnd = 0); }
  260.   InputBit := Bit;
  261.   IF SoundOn THEN IF Bit THEN Sound(MFreq)
  262.                          ELSE NoSound;
  263. END;  { InputBit }
  264.  
  265. PROCEDURE Decode(VAR Zustand : BOOLEAN; VAR Count : WORD);
  266. VAR Zust, ZustAlt : BOOLEAN;            { Signale erkennen }
  267.     FehlerZaehl : WORD;
  268. CONST MaxFehler = 5;
  269. BEGIN
  270.   ZustAlt := InputBit; FehlerZaehl := 0;
  271.   REPEAT
  272.     Inc(Count); Delay(1);
  273.     IF InputBit <> ZustAlt THEN Inc(FehlerZaehl)
  274.                            ELSE FehlerZaehl := 0;
  275.   UNTIL (FehlerZaehl > MaxFehler) OR (Count = $FFFF)
  276.                                   OR KeyPressed;
  277.   Zustand := ZustAlt;
  278. END;  { Decode }
  279.  
  280. PROCEDURE AdjustSpeed;         { Geschwindigkeitsanpassung }
  281. CONST MaxCount = 10;                     { Anzahl Meßwerte }
  282. VAR Help : LONGINT; Count, Count2 : WORD;
  283.     Zustand, ZustandAlt : BOOLEAN; n, nn, Hi : BYTE;
  284.     Vals : ARRAY[1..MaxCount] OF WORD;
  285. BEGIN
  286.   Line(14, 'Geschwindigkeitsabgleich - bitte warten...');
  287.   WriteLn; Decode(Zustand, Count);   { Signalende abwarten }
  288.   Short := $FFFF; Long := 1;
  289.   Zustand := FALSE; ZustandAlt := TRUE;
  290.   FOR n := 1 TO MaxCount DO BEGIN     { Meßwerte aufnehmen }
  291.     Write(MaxCount - n, '...'); Count := 0;
  292.     REPEAT Decode(Zustand, Count);
  293.     UNTIL NOT Zustand;
  294.     Count := 0;
  295.     REPEAT Decode(Zustand, Count);
  296.     UNTIL Zustand;
  297.     Count2 := 0;
  298.     REPEAT Decode(Zustand, Count2);
  299.     UNTIL NOT Zustand;
  300.     Vals[n] := Count;
  301.   END;  { FOR }
  302.   FOR n := 1 TO MaxCount - 1 DO       { Meßwerte sortieren }
  303.     FOR nn := n TO MaxCount DO
  304.       IF Vals[n] > Vals[nn] THEN BEGIN
  305.         Count := Vals[n];
  306.         Vals[n] := Vals[nn];
  307.         Vals[nn] := Count;
  308.       END;
  309.   Help := Vals[MaxCount]; Hi := 1;   { Zeitermittlung lang }
  310.   FOR n := MaxCount DOWNTO 1 DO
  311.     IF Vals[n] > Vals[MaxCount] DIV 2 THEN BEGIN       
  312.       Inc(Help, Vals[n]); Inc(Hi);    { "Ausreißer" werden }
  313.     END;                                      { eliminiert }
  314.   Long := Help DIV Hi;
  315.   Help := 0; Hi := 0;                { Zeitermittlung kurz }
  316.   FOR n := 1 TO MaxCount DO
  317.     IF Abs(Round(Vals[n] - Long DIV 3)) < Long DIV 4 THEN
  318.     BEGIN
  319.       Inc(Help, Vals[n]); Inc(Hi);
  320.     END;
  321.   IF Hi = 0 THEN Short := Long DIV 3
  322.             ELSE Short := Help DIV Hi;
  323. END;  { AdjustSpeed }
  324.  
  325. PROCEDURE AdjustLevel;           { grafische Abgleichhilfe }
  326. VAR Gd, Gm, x, y : INTEGER; Abbruch : BOOLEAN;
  327. BEGIN
  328.   Abbruch := FALSE;
  329.   DetectGraph(Gd, Gm); InitGraph(Gd, Gm, GetEnv('BGIPATH'));
  330.   SetTextStyle(DefaultFont, HorizDir, 1);
  331.   SetTextJustify(CenterText, TopText);
  332.   OutTextXY(GetMaxX DIV 2, 0,
  333.             'Pegelabgleich - Ende mit Tastendruck...');
  334.   REPEAT
  335.     y := TextHeight('X') * 2;
  336.     REPEAT
  337.       x := 0;
  338.       REPEAT
  339.         Abbruch := KeyPressed;
  340.         IF InputBit THEN PutPixel(x, y, GetMaxColor)
  341.                     ELSE PutPixel(x, y, 0);
  342.         Delay(1); Inc(x);
  343.       UNTIL (x > GetMaxX) OR Abbruch;
  344.       Inc(y, GetMaxY DIV 50);
  345.     UNTIL (y > GetMaxY) OR Abbruch;
  346.   UNTIL Abbruch;
  347.   WHILE KeyPressed DO ReadKey;
  348.   NoSound; RestoreCrtMode;
  349. END;  { AdjustLevel }
  350.  
  351. PROCEDURE Empfange(TextOnly : BOOLEAN);
  352. TYPE MorseType =
  353.      (NoSign, SLong, SShort, PCode, PLetter, PWord);
  354. VAR Zustand, ZustandAlt : BOOLEAN; Queue : STRING[MaxLen];
  355.     Count : WORD; Sign : MorseType; ch : CHAR;
  356. BEGIN
  357.   ClrScr;
  358.   Line(1, '⌐Automatischer Empfang von Morsezeichen¬');
  359.   Line(2, 'Ton ⌐u¬mschalten, ⌐ESC¬ Abbruch');
  360.   WriteLn; WriteLn;
  361.   ZustandAlt := TRUE; Zustand := FALSE;
  362.   Queue := ''; Count := 0; ch := #0;
  363.   REPEAT
  364.     Decode(Zustand, Count);
  365.     IF KeyPressed THEN BEGIN
  366.       ch := UpCase(ReadKey);
  367.       IF ch = 'U' THEN BEGIN
  368.         SoundOn := NOT SoundOn; NoSound;
  369.       END;
  370.     END;
  371.     IF Zustand <> ZustandAlt THEN
  372.     BEGIN                   { anderer Impuls -> Auswertung }
  373.       ZustandAlt := Zustand; Sign := PCode;
  374.       CASE Zustand OF
  375.         TRUE :                          { Signalauswertung }
  376.           IF Count > 3 * Long DIV 5 THEN BEGIN   { Signal: }
  377.             Sign := SLong;                          { lang }
  378.             Long := (Vari*Count + (100-Vari)*Long) DIV 100;
  379.           END ELSE
  380.             IF Count < Long DIV 2 THEN BEGIN
  381.               Sign  := SShort;                      { kurz }
  382.               Short := (Vari*Count + (100-Vari)*Short)
  383.                        DIV 100;
  384.             END;
  385.         FALSE :                         { Pausenauswertung }
  386.           CASE Round(10*(Count/((Long + Short) DIV 2))) OF
  387.             0..10  : Sign := PCode;
  388.             11..30 : Sign := PLetter;
  389.             31..99 : Sign := PWord;
  390.           END;
  391.       END;  { CASE }
  392.       CASE Sign OF             { Zeichen: Queue verlängern }
  393.         SLong  : Queue := Queue + '-';
  394.         SShort : Queue := Queue + '.';
  395.       END;  { CASE }
  396.       IF (Length(Queue) = MaxLen) OR
  397.          (Sign IN [PWord, PLetter]) AND
  398.          (Length(Queue) > 0) THEN BEGIN
  399.         IF WhereX > 70 THEN BEGIN
  400.           WriteLn; WriteLn(EmpfProtF);
  401.         END;
  402.         ch := DekodiereZeichen(Queue);
  403.         IF TextOnly THEN BEGIN
  404.           Write(ch); Write(EmpfProtF, ch);
  405.           IF Sign = PWord THEN BEGIN
  406.             Write(' '); Write(EmpfProtF, ' ');
  407.           END;
  408.         END ELSE BEGIN
  409.           Write(Queue : 8, #32);
  410.           HighVideo; Write(ch); LowVideo;
  411.           Write(EmpfProtF, Queue:8, #32, ch);
  412.         END;
  413.         Queue := '';
  414.       END;
  415.       Count := 0;
  416.     END;  { IF }
  417.   UNTIL ch = #27;
  418. END; { Empfange }
  419.  
  420. PROCEDURE EmpfangsMenue;
  421. VAR ch : CHAR;
  422. BEGIN
  423.   IF DateiExistiert(EmpfProtFName) THEN BEGIN
  424.     Assign(EmpfProtF, EmpfProtFName);
  425.     Append(EmpfProtF);
  426.     WriteLn(EmpfProtF);
  427.     WriteLn(EmpfProtF, '  Nächster Eintrag : ');
  428.   END
  429.   ELSE BEGIN
  430.     Assign(EmpfProtF, EmpfProtFName);
  431.     ReWrite(EmpfProtF);
  432.     WriteLn(EmpfProtF, '  Erster Eintrag   : ');
  433.   END;
  434.   REPEAT;
  435.     KopfZeile;
  436.     Line(3, '⌐E m p f a n g s - M e n ü¬');
  437.     Line(5, 'Ausgabe : ⌐T¬ext       ⌐M¬orsecode + Text');
  438.     Line(7, 'Abgleich: ⌐P¬egel      ⌐G¬eschwindigkeit');
  439.     Line(9, 'Ton     : ⌐U¬mschalten');
  440.     Line(11,'⌐Esc¬     Hauptmenü');
  441.     REPEAT InputBit;
  442.     UNTIL KeyPressed;
  443.     ch := UpCase(ReadKey);
  444.     CASE ch OF
  445.       'T': Empfange(TRUE);
  446.       'M': Empfange(FALSE);
  447.       'P': AdjustLevel;
  448.       'G': AdjustSpeed;
  449.       'U': BEGIN
  450.              SoundOn := NOT SoundOn;
  451.              NoSound;
  452.            END;
  453.     END;
  454.   UNTIL ch = #27;
  455.   NoSound;
  456.   WriteLn(EmpfProtF);
  457.   Close(EmpfProtF);
  458. END;  { EmpfangsMenue }
  459.  
  460. FUNCTION Num2Str(Num : WORD) : STRING;
  461. VAR s : STRING;
  462. BEGIN
  463.   Str(Num, s); Num2Str := s;
  464. END;  { Num2Str }
  465.  
  466. PROCEDURE ParameterAendern;
  467. VAR ZChar, ch : CHAR;
  468. BEGIN
  469.   REPEAT;
  470.     KopfZeile;
  471.     Line(3, '⌐P a r a m e t e r   ä n d e r n¬');
  472.     Line(5, '⌐K¬ennung               : ' + Kennung);
  473.     Line(6, '⌐S¬endeprotokolldatei   : ' + SendProtFName);
  474.     Line(7, '⌐E¬mpfangsprotokolldatei: ' + EmpfProtFName);
  475.     Line(8, '⌐F¬requenz Tonsignal    : ' +
  476.             Num2Str(MFreq) + ' Hz');
  477.     Line(9, 'Sende⌐g¬eschwindigkeit  : ' +
  478.             Num2Str(ZProMin) + ' Z/min');
  479.     Line(10,'⌐V¬ariabilität          : ' +
  480.             Num2Str(Vari) + ' %');
  481.     Line(12,'⌐Esc¬ Hauptmenü');
  482.     ch := UpCase(ReadKey);
  483.     CASE ch OF
  484.       'K' : AcceptStr(34, 5, Kennung);
  485.       'S' : BEGIN
  486.               AcceptStr(34, 6, SendProtFName);
  487.               IF Pos('.', SendProtFName) = 0 THEN
  488.                 SendProtFName := SendProtFName + '.SPF';
  489.             END;
  490.       'E' : BEGIN
  491.               EmpfProtFName := '________.EPF';
  492.               AcceptStr(34, 7, EmpfProtFName);
  493.               IF Pos('.', EmpfProtFName) = 0
  494.               THEN EmpfProtFName :=
  495.                    EmpfProtFName + '.EPF';
  496.             END;
  497.       'F' : AcceptNum(34, 8, MFreq);
  498.       'G' : BEGIN
  499.               AcceptNum(34, 9, ZProMin);
  500.               IF ZProMin > 240 THEN ZProMin := 240;
  501.               IF ZProMin < 20  THEN ZProMin := 20;
  502.               MTime := (70 * 80 DIV ZProMin);
  503.             END;
  504.       'V' : BEGIN
  505.               AcceptNum(34, 10, Vari);
  506.               IF Vari > 50 THEN Vari := 50;
  507.             END;
  508.     END;
  509.   UNTIL ch = #27;
  510. END; { ParameterAendern }
  511.  
  512. BEGIN                                      { Hauptprogramm }
  513.   MFreq := 1000;                 { Tonfrequenz beim Senden }
  514.   Kennung := 'PC-AutoMorser von A. Bartels und toolbox';
  515.   ZProMin := 80;                    { Sendegeschwindigkeit }
  516.   MTime := (70 * 80 DIV ZProMin);     { Länge eines kurzen
  517.                   Sendetons in ms (70 ms bei 80 Zeich/Min) }
  518.   Vari := 10;             { Nachjustierung pro Impuls in % }
  519.   Short := 80; Long  := 250; { Defaultzeiten kurz und lang }
  520.   EmpfProtFName := 'Default.EPF';       { Defaultnamen für }
  521.   SendProtFName := 'Default.SPF';       { Protokolldateien }
  522.   REPEAT
  523.     KopfZeile;
  524.     Line(3, '⌐H a u p t - M e n ü¬');
  525.     Line(5, '⌐S¬enden  ⌐E¬mpfangen  ⌐P¬arameter ändern');
  526.     Line(7, '⌐Esc¬ Programmende');
  527.     CASE UpCase(ReadKey) OF
  528.       'S' : SendeMenue;
  529.       'E' : EmpfangsMenue;
  530.       'P' : ParameterAendern;
  531.       #27 : GameOver := TRUE;
  532.     END;
  533.   UNTIL GameOver;
  534.   NoSound; ClrScr;
  535. END.
  536. (* ------------------------------------------------------ *)
  537. (*               Ende von MORSENPC.PAS                    *)
  538.