{###########################################################################}
procedure SendFlash;
//Sende ein Byte an den Flash über FPGA geroutet; /CS muss gesetzt sein!
begin
  asm;
    lds  _ACCA, FPGA.Flashbyte
    out SPDR, _ACCA     ; SPI von FAT16-Treiber eingeschaltet!
  FLASHwait8_1:
    in _ACCA, SPSR
    sbrs _ACCA,7 ; SPIF?
    rjmp FLASHwait8_1     ;  auf Ende des SPI-Transfer warten
  endasm;
end;

procedure SendFlashSel;
//Sende ein Byte an den Flash über FPGA geroutet; /CS muss gesetzt sein!
begin
  FLASHSEL:=low;
  SendFlash;
  FLASHSEL:=high;
end;

{FPGA functions }

procedure SendFPGA32;
//Sende und empfange ein Langwort (32 Bit-Register) an den FPGA-Chip über SPI
begin
  asm;
    cbi  FPGA.ControlBitPort, FPGA.b_MOSI
    cbi  FPGA.ControlBitPort, FPGA.b_SCK
    lds  _ACCA, FPGA.FPGAparam+3
    cbi  FPGA.ControlBitPort, FPGA.b_DATASEL
    out SPDR, _ACCA    ; SPI wurde von FAT16-Treiber eingeschaltet!
  SPIwait32_1:
    in _ACCA, SPSR
    sbrs _ACCA,7       ; SPIF gesetzt?
    rjmp SPIwait32_1   ; auf Ende des SPI-Transfer warten
    in _ACCA, SPDR     ; und empfangenes Byte wieder in FPGAparam ablegen
    sts  FPGA.FPGAparam+3, _ACCA

    lds  _ACCA, FPGA.FPGAparam+2
    out SPDR, _ACCA     ; SPI von FAT16-Treiber eingeschaltet!
  SPIwait32_2:
    in _ACCA, SPSR
    sbrs _ACCA,7
    rjmp SPIwait32_2
    in _ACCA, SPDR
    sts  FPGA.FPGAparam+2, _ACCA

    lds  _ACCA, FPGA.FPGAparam+1
    out SPDR, _ACCA
  SPIwait32_3:
    in _ACCA, SPSR
    sbrs _ACCA,7
    rjmp SPIwait32_3
    in _ACCA, SPDR
    sts  FPGA.FPGAparam+1, _ACCA

    lds  _ACCA, FPGA.FPGAparam+0
    out SPDR, _ACCA
  SPIwait32_4:
    in _ACCA, SPSR
    sbrs _ACCA,7
    rjmp SPIwait32_4
    in _ACCA, SPDR
    sts  FPGA.FPGAparam+0, _ACCA

    sbi  FPGA.ControlBitPort, FPGA.b_DATASEL
  endasm;
end;

procedure SendFPGA8;
//Sende ein Byte (Registeradresse) an den FPGA-Chip
begin
  asm;
    cbi  FPGA.ControlBitPort, FPGA.b_MOSI
    cbi  FPGA.ControlBitPort, FPGA.b_SCK
    lds  _ACCA, FPGA.FPGAreg
    cbi  FPGA.ControlBitPort, FPGA.b_REGSEL
    out SPDR, _ACCA     ; SPI von FAT16-Treiber eingeschaltet!
  SPIwait8_1:
    in _ACCA, SPSR
    sbrs _ACCA,7 ; SPIF?
    rjmp SPIwait8_1     ;  auf Ende des SPI-Transfer warten
    sbi  FPGA.ControlBitPort, FPGA.b_REGSEL
  endasm;
end;

procedure ShiftFPGAconf;  //Sende ein Byte an FPGA-Configuration
begin
  asm;
    lds  _ACCA, FPGA.FPGAbyte
    cbi  FPGA.ConFPGABitPort, FPGA.c_CCLK
    ldi  _ACCB, 8
    FPGA.confloop1:    ; höherwertiges Byte rausschieben
    sbrc _ACCA,7 // Bit high?
    sbi  FPGA.ConFPGABitPort, FPGA.c_DATA
    sbrs _ACCA,7 // Bit low?
    cbi  FPGA.ConFPGABitPort, FPGA.c_DATA
    sbi  FPGA.ConFPGABitPort, FPGA.c_CCLK
    LSL  _ACCA
    cbi  FPGA.ConFPGABitPort, FPGA.c_CCLK
    dec _ACCB
    brne  FPGA.confloop1
  endasm;
end;

{###########################################################################}

//FPGA-Funktionen



procedure SendParamArrayFPGA;
begin
  for i:=0 to 3 do
    FPGAreg:=i;
    SendFPGA8;
    FPGAparam:=ParamLongArray[i];
    SendFPGA32;
  endfor;
end;

procedure ExchangeFPGA;
// Kompketter Datenaustauch vier 32-Bit-Register
begin
  for i:=0 to 3 do
    FPGAreg:=i;     // Schreib-Register
    SendFPGA8;
    FPGAparam:=ParamLongArray[i];
    SendFPGA32;

    FPGAreg:=i+$10; // Lese-Register
    SendFPGA8;
    SendFPGA32;  // Dummy gesendet, FPGAparam empfangen auf gleichem Kanal
    InputLongArray[i]:=FPGAparam;
  endfor;
end;


