{###########################################################################}
{$IFDEF miniDDS}
//Angepasst für Mini-DDS und MP3-Steuerplatine

procedure WriteLCD(myAdr : pointer);
//Kurze, schnelle Ausgabe eines Strings aus ROM
//über Adresspointer LCDwrite(@myString).
begin
//normales LCD an Port
  asm;
    LDD       _ACCCLO, Y+000h
    CLR       _ACCA
    LDD       _ACCCHI, Y+001h
    ADC       _ACCCHI, _ACCA   ; Z-Pointer gesetzt auf String-Adresse
    LPM       _ACCDLO, Z+      ; Pascal-Längenbyte
    WriteLCDLoop:
    LPM       _ACCA, Z+        ; nächstes Zeichen in _ACCA
    PUSH      _ACCCHI
    PUSH      _ACCCLO
    RCALL     SYSTEM.LCDOUT
    POP       _ACCCLO
    POP       _ACCCHI
    DEC       _ACCDLO
    BRNE      WriteLCDLoop
  endasm;
end;

procedure FastRepeatRelease;
{Warten bis alle Tasten vom Bedienpanel losgelassen oder Timer abgelaufen}
begin
{$IFDEF IncrEnc}
  repeat
    BtnInState:= PinD; // für später, sonst Fehlverhalten wg. Prellen
    i:= BtnInState or %01000011;
    mdelay(10); //Prellzeit
  until (i = %11111111);
  mdelay(10); //Prellzeit
{$ELSE}
  dectolim(BtnTime2, 0);
  repeat
    dec(BtnTime);
    if BtnTime2 = 0 then
      mdelay(4); //Schnelldurchlauf
    else
      mdelay(15); //Langsamdurchlauf
    endif;
    BtnInState:= PinD; // für später, sonst Fehlverhalten wg. Prellen
    i:= BtnInState or %01000011;
  until (i = %11111111) or (BtnTime = 0);
  if i = %11111111 then  // wenn losgelassen, Timer zurücksetzen
    BtnTime:= 40; // Initial timer value
    BtnTime2:= 5; // Anzahl Durchläufe bis fast forward
  else
    BtnTime:= 10; // Repeat timer value
  endif;
{$ENDIF}
end;

procedure SlowRepeatRelease;
begin
  BtnTime2:= 255; // Anzahl Durchläufe bis fast forward
  FastRepeatRelease;
end;

function NaviButton : Boolean;
{Liefert true wenn irgendeine Taste außer Up/Down gedrückt, Sample in BtnInState}
begin
  BtnInState:= PinD; // für später, sonst Fehlverhalten wg. Prellen
  aBool := ((BtnInState or %00001111) <> %11111111);
  return (aBool);
end;

function UpDownButton : Boolean;
{Liefert true wenn eine der Up/Down-Tasten gedrückt, Sample in BtnInState}
begin
  BtnInState:= PinD; // für später, sonst Fehlverhalten wg. Prellen
  aBool := ((BtnInState or %11110011) <> %11111111);
  return (aBool);
end;

{###########################################################################}
{$ELSE}
//angepasst für MIDIvice-Platine mit I2C-LCD
procedure WriteLCD(myAdr : pointer);
//Kurze, schnelle Ausgabe eines Strings aus ROM
//über Adresspointer LCDwrite(@myString).
begin
//LCDmulti an I2C-Bus (MIDIvice)
  asm;
    LDD       _ACCCLO, Y+000h
    CLR       _ACCA
    LDD       _ACCCHI, Y+001h
    ADC       _ACCCHI, _ACCA

    PUSH      _FRAMEPTR
    PUSH      _FPTRHI
    LDI       _ACCA, 1 SHLB _DEVICE
    OR        Flags, _ACCA
    LDI       _ACCB, SYSTEM.LCDOut_M SHRB 1
    LDI       _ACCA, SYSTEM.LCDOut_M SHRB 9
    ST        -Y, _ACCA
    ST        -Y, _ACCB
    LPM       _ACCBHI, Z+      ; Pascal-Längenbyte
    WriteLCDLoop:
    LPM       _ACCA, Z+
    CALL     SYSTEM.Char2Str
    DEC       _ACCBHI
    BRNE      WriteLCDLoop
    POP       _FPTRHI
    POP       _FRAMEPTR
  endasm;
end;

procedure FastRepeatRelease;
{Warten bis alle Tasten vom Bedienpanel losgelassen oder Timer abgelaufen}
begin
{$IFDEF IncrEnc}
  repeat
    BtnInState:=PinD; // für später, sonst Fehlverhalten wg. Prellen
    i:= BtnInState or %00000111;
    mdelay(10); //Prellzeit
  until (i = %11111111);
  mdelay(10); //Prellzeit
{$ELSE}
  dectolim(BtnTime2,0);
  repeat
    dec(BtnTime);
    if BtnTime2 = 0 then
      mdelay(4); //Prellzeit
    else
      mdelay(15); //Prellzeit
    endif;
    BtnInState:=PinD; // für später, sonst Fehlverhalten wg. Prellen
    i:= BtnInState or %00000111;
  until (i = %11111111) or (BtnTime = 0);
  if i= %11111111 then  // wenn losgelassen, Timer zurücksetzen
    BtnTime:=40; // Initial timer value
    BtnTime2:=5; // Anzahl Durchläufe bis fast forward
  else
    BtnTime:=10; // Repeat timer value
  endif;
{$ENDIF}
end;

procedure SlowRepeatRelease;
begin
  BtnTime2:=255; // Anzahl Durchläufe bis fast forward
  FastRepeatRelease;
end;

function NaviButton : Boolean;
{Liefert true wenn irgendeine Taste außer Up/Down gedrückt, Sample in BtnInState}
begin
  BtnInState:=PinD; // für später, sonst Fehlverhalten wg. Prellen
  aBool := ((BtnInState or %01100111) <> %11111111);
  return (aBool);
end;

function UpDownButton : Boolean;
{Liefert true wenn eine der Up/Down-Tasten gedrückt, Sample in BtnInState}
begin
  BtnInState:=PinD; // für später, sonst Fehlverhalten wg. Prellen
  aBool := ((BtnInState or %10011111) <> %11111111);
  return (aBool);
end;
{###########################################################################}
{$ENDIF}

