Program sinewave;

Uses Crt,Dos,SysUtils;

Var c:Char;
    bn,br:Byte;
    sn:String;
    ub,ul,uh:Extended;

Procedure GetBits;
Begin
Write('Anzahl Bits R/2R ... ');
Readln(bn);
If bn>8 Then
  Begin
  Writeln('Keine Werte >8 moeglich!');
  Writeln('Wert auf 8 gesetzt!');
  End;
sn:='sine'+IntToStr(bn)+'.txt';
End;    
    
Procedure GetFileName;
Begin
Write('Dateiname ... ');
Readln(sn);
End;
    
Procedure GetOperatingVoltage;
Begin
Write('Betriebsspannung ... ');
Readln(ub);
End;

Procedure GetLowAmplitude;
Begin
Write('Niedrigste Amplitude in Volt ... ');
Readln(ul);
End;

Procedure GetHighAmplitude;
Begin
Write('Hoechste Amplitude in Volt ... ');
Readln(uh);
End;

Procedure GoCalc;
Var f:Text;
  fok,fnl:Boolean;
  n,ns:LongInt;
  sl:String;
  u,um:Extended;
  be:Byte;
Begin
fOk:=True;
If FileExists(sn) Then
  Begin
  Write('Datei ',sn,' existiert, ueberschreiben (Y/N) ... ');
  c:=UpCase(Readkey);
  fok:=C='Y';
  End;
If fok Then
  Begin
  Writeln('Schreibe Ergebnisdatei ',sn,' ... ');
  Assign(f,sn);
  ReWrite(f);
  Writeln(f,';');
  Writeln(f,'; Sinustabelle fuer ',bn,' Bits D/A');
  Writeln(f,'; Tabellenlaenge = ',1<<br,' Werte');
  Writeln(f,'; VCC=',ub:5:3,'V, uLow=',ul:5:3,'V, uHigh=',uh:5:3,'V');
  Writeln(f,'; (mit sinewave.pas erzeugt)');
  Writeln(f,';');
  Writeln(f,'Sinetable:');
  ns:=1<<br-1;
  sl:='';
  um:=(uh-ul)/2.0+ul;
  Writeln('um=',um:5:3);
  For n:=0 To ns Do
    Begin
    If (n Mod 8)=0 Then
      Begin
      If sl<>'' Then Writeln(f,sl);
      sl:='.DB ';
      fnl:=True;
      End;
    If Not fnl Then sl:=sl+',';
    u:=um+(uh-um)*SIN(2.0*PI*n/(ns+1));
    be:=Round(u/ub*(1<<bn-1));
    Writeln(u:5:3);
    sl:=sl+IntToStr(be);
    fnl:=False;
    End;
  Writeln(f,sl);
  Close(f);
  Writeln('Ergebnisdatei fertig.');
  End;
End;

Procedure GetResolution;
Begin
Repeat
  Write('Aufloesung 3..8 (fuer Tabellenlaengen von 8 to 256) ... ');
  Readln(br);
  If br<3 Then Writeln('Aufloesung zu klein!');
  If br>8 Then Writeln('Aufloesung zu gross!');
  Until (br>=3) And (br<=8);
End;

Begin
bn:=6;
br:=8;
sn:='sine6.txt';
ub:=5.0;
ul:=0.0;
uh:=5.0;
Repeat
  Writeln;
  Writeln('Sinustabelle fuer R/2R-Netzwerke');
  Writeln('--------------------------------');
  Writeln('<B>its Amplitude (',bn,'), <R>esolution (',1<<br,')');
  Writeln('<O>perationsspannung (',ub:5:3,'),');
  Writeln('<L>ow/<H>igh Amplitude (',ul:5:3,'/',uh:5:3,'),');
  Write('<S>ave (',sn,'), <G>o, <ESC> ... ');
  c:=Upcase(ReadKey);
  If c<>Char(27) Then Writeln(c) Else Writeln('ESC');
  Case c Of
    'B':GetBits;
    'R':GetResolution;
    'S':GetFilename;
    'L':GetLowAmplitude;
    'H':GetHighAmplitude;
    'G':GoCalc;
    End;
  Until c=Char(27);
End.

