Program sinewave;

Uses Crt,Dos,SysUtils;

Var c:Char;
    bn:Byte;
    sn:String;
    ub,ul,uh:Extended;

Procedure GetBits;
Begin
Write('Number of bits ... ');
Readln(bn);
If bn>8 Then
  Begin
  Writeln('No value >8 possible!');
  Writeln('Setting value to 8!');
  End;
sn:='sine'+IntToStr(bn)+'.txt';
End;    
    
Procedure GetFileName;
Begin
Write('Filename ... ');
Readln(sn);
End;
    
Procedure GetOperatingVoltage;
Begin
Write('Operating voltage ... ');
Readln(ub);
End;

Procedure GetLowAmplitude;
Begin
Write('Lower amplitude voltage limit ... ');
Readln(ul);
End;

Procedure GetHighAmplitude;
Begin
Write('Upper amplitude voltage limit ... ');
Readln(uh);
End;

Procedure GoCalc;
Var f:Text;
  fok,fnl:Boolean;
  n,ns:LongInt;
  sl:String;
  r,u,um:Extended;
  be:Byte;
Begin
fOk:=True;
If FileExists(sn) Then
  Begin
  Write('File ',sn,' exists, overwrite (Y/N) ... ');
  c:=UpCase(Readkey);
  fok:=C='Y';
  End;
If fok Then
  Begin
  Writeln('Writing result file ',sn,' ... ');
  Assign(f,sn);
  ReWrite(f);
  Writeln(f,';');
  Writeln(f,'; Sinewave table for ',bn,' bit D/A');
  Writeln(f,'; VCC=',ub:5:3,'V, uLow=',ul:5:3,'V, uHigh=',uh:5:3,'V');
  Writeln(f,'; (generated by sinewave.pas)');
  Writeln(f,';');
  Writeln(f,'Sinetable:');
  ns:=2<<(bn-1)-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*ns);
    Writeln(u:5:3);
    sl:=sl+IntToStr(be);
    fnl:=False;
    End;
  Writeln(f,sl);
  Close(f);
  Writeln('Result file done.');
  End;
End;

Procedure test;
Var k,ns:LongInt;
Begin
ns:=2<<(bn-1)-1;
Writeln(bn,': ns=',ns);
For k:=0 To ns Do Write(SIN(2.0*PI*k/(ns+1)):6:3,',  ');
End;

Begin
bn:=6;
sn:='sine6.txt';
ub:=5.0;
ul:=0.0;
uh:=5.0;
Repeat
  Writeln;
  Writeln('Sinewave calculation for R/2R-networks');
  Writeln('--------------------------------------');
  Writeln('<B>its (',bn,'), <S>ave (',sn,'),');
  Writeln('<O>perating voltage (',ub:5:3,'),');
  Writeln('<L>ow/<H>igh amplitude (',ul:5:3,'/',uh:5:3,'),');
  Write('<G>o, <ESC> ... ');
  c:=Upcase(ReadKey);
  If c<>Char(27) Then Writeln(c) Else Writeln('ESC');
  Case c Of
    'B':GetBits;
    'S':GetFilename;
    'L':GetLowAmplitude;
    'H':GetHighAmplitude;
    'G':GoCalc;
    'T':test;
    End;
  Until c=Char(27);
End.
