// für MP3Source Mainboard ab V2.1

{###########################################################################}
procedure miniDDS;
begin
  disableints;
  m:= byte(wave);
  asm;
    mov  _ACCA, SoftDDS.m
    ldi  _ACCDLO, $FF; kein Taster gedrückt-Vergleich
    mov  SoftDDS.m, _ACCDLO
   ; set sinewave output as default
    ldi  _ACCCHI, SoftDDS.sinus SHRB 8; setup Z pointer hi
    ldi  _ACCCLO, SoftDDS.sinus AND $FF; setup Z pointer lo
    ldi  _ACCDHI, $00; clear accumulator
    ldi  _ACCDLO, $00
    mov  _ACCFLO, SoftDDS.DDSL; setup adder registers
    mov  _ACCFHI, SoftDDS.DDSM
    mov  _ACCBLO, SoftDDS.DDSH;
    tst  _ACCA
    breq  SoftDDS.SinLoop
    dec  _ACCA
    breq  SoftDDS.TriLoop
    dec  _ACCA
    breq  SoftDDS.SquLoop
    rjmp  SoftDDS.myExit

   ; _ACCDLO, _ACCDHI, _ACCCLO is the phase accumulator
   ; _ACCFLO, _ACCFHI, _ACCBLO is the adder value determining frequency

   ; Sinus:
    SoftDDS.SinLoop:
    add _ACCDLO, _ACCFLO; 1  add value to accumulator
    adc _ACCDHI, _ACCFHI; 1
    adc _ACCCLO, _ACCBLO; 1
    lpm; 3, ROM Zugriff Sinustabelle
    out PORTA, _ACCGLO; 1  output byte to port
    in        _ACCA, PIND; 1
    CPSE      _ACCA, SoftDDS.m; 2, bei Änderung an Taster-Port abbrechen
    rjmp SoftDDS.myExit; bei Abbruch
    rjmp SoftDDS.SinLoop; 2 = > 12 cycles

   ; Rechteck:
    SoftDDS.SquLoop:
    add _ACCDLO, _ACCFLO; 1
    adc _ACCDHI, _ACCFHI; 1
    adc _ACCCLO, _ACCBLO; 1
    ldi  _ACCA, $00; 1
    brmi  SoftDDS.setsqu; 1 / 2
    ldi  _ACCA, $FF; 0 / 1
    SoftDDS.setsqu:
    out PORTA, _ACCA; 1
    in        _ACCA, PIND; 1
    CPSE      _ACCA, SoftDDS.m; 2, bei Änderung an Taster-Port abbrechen
    rjmp SoftDDS.myExit; bei Abbruch
    rjmp SoftDDS.SquLoop; 2 = > 12 cycles

    in          SoftDDS.m, PIND;  m:= PinD;
    ldi  _ACCDHI, $00; clear accumulator
    ldi  _ACCDLO, $00
    mov  _ACCFLO, SoftDDS.DDSL; setup adder registers
    mov  _ACCFHI, SoftDDS.DDSM
    mov  _ACCBLO, SoftDDS.DDSH;

   ; Sägezahn:
    SoftDDS.TriLoop:
    add _ACCDLO, _ACCFLO; 1
    adc _ACCDHI, _ACCFHI; 1
    adc _ACCCLO, _ACCBLO; 1

    mov _ACCA, _ACCCLO; Zählerstand LSB
    nop
    nop

    out PORTA, _ACCA; 1
    in        _ACCA, PIND; 1
    CPSE      _ACCA, SoftDDS.m; 2, bei Änderung an Taster-Port abbrechen
    rjmp SoftDDS.myExit; bei Abbruch
    rjmp SoftDDS.TriLoop; 2 = > 12 cycles

    SoftDDS.myExit:
    ldi  _ACCA, 128; Ausgang auf 8-Bit-Mittelwert
    out PORTA, _ACCA
  endasm;
  enableints;
end;

{###########################################################################}

procedure Shift4094; //Sende Byte in Out4094 an den 4094
begin
  asm;
    LDS _ACCA, SoftDDS.Out4094;
    sbi  SoftDDS.MPXPort, SoftDDS.b_STROBE
    cbi  SoftDDS.MPXPort, SoftDDS.b_SCLK
    ldi  _ACCB, 8

    SoftDDS.srloop:
    LSL  _ACCA
    brcs SoftDDS.datahigh1
    cbi  SoftDDS.MPXPort, SoftDDS.b_SDATA
    rjmp SoftDDS.dataset1
    SoftDDS.datahigh1:
    sbi  SoftDDS.MPXPort, SoftDDS.b_SDATA
    SoftDDS.dataset1:
    nop
    sbi  SoftDDS.MPXPort, SoftDDS.b_SCLK
    nop
    cbi  SoftDDS.MPXPort, SoftDDS.b_SCLK
    dec _ACCB
    BRNE  SoftDDS.srloop

    cbi  SoftDDS.MPXPort, SoftDDS.b_STROBE
    sbi  SoftDDS.MPXPort, SoftDDS.b_SCLK
  endasm;

end;



procedure SetLevelDDS;
//Pegelsteller und Relais setzen, Frequenz einstellen
var
  freq, fac, acc : LongInt;
  freqHi, freqLo : word;
begin
//Pegel einstellen, 80 = +10dB Nennpegel
  k:= 80 - AttnStep;
  Out4094:= (k div 10) shl 5;  // 10-dB-Schritte
  k := k mod 10;
  if k > 7 then
    k := k OR  %00010000;
    k := k AND %11110111;
  else
    k := k OR  %00001000;
    k := k AND %11101111;
  endif;
  Out4094 := Out4094 OR k;
  Shift4094;

//DSS-Frequenz einstellen
  freq:= 0;
  for i := 0 to 6 do                //Einzelne Stellen aufaddieren
    fac:= LongInt(gettable(EditArray, (i)));
    acc:= gettable(fhz, i);
    freq:= freq + (acc*fac);
  endfor;
  acc:= LongInt(gettable(fdhz, FrequDez)); //Dezihertz
  freq:= freq + acc;
  freqHi:= hiword(freq);
  freqLo:= Loword(freq);
  DDSL:= Lo(freqLo);
  DDSM:= Hi(freqLo);
  DDSH:= Lo(freqHi);
end;


