procedure RTCtickSecond;      // CallBack from RTCclock
begin
  tickSeconds:=true;
end;

procedure RTCtickMinute;      // CallBack from RTCclock
begin
  tickMinutes:=true;
end;

procedure RTCtickHour;        // CallBack from RTCclock
begin
  tickHours:=true;
end;

{$IFDEF EXTRTC}
procedure ShiftRTCout;  // für externe RTC DS1302 oder HT1381 an PortD
begin
  DDRD:=  DDRDinitWrRTC;       {PortD dir}
  PortD:= PortDinit;           {PortD}
  asm;
    sbi  PortD, LED.p_RTCrst

    lds  _ACCA, LED.RTCcmd
    lsl  _ACCA        // wg. RW-Bit
    andi  _ACCA,$FE   // RW-Bit auf 0
    ori  _ACCA,$80    // MSB auf 1
    ldi  _ACCB, 8

    LED.cmdloop1:    ; Cmd-Byte rausschieben
    sbrs _ACCA,0 // Bit low?
    cbi  PortD, LED.p_RTCio
    sbrc _ACCA,0 // Bit high?
    sbi  PortD, LED.p_RTCio
    sbi  PortD, LED.p_RTCclk
    lsr  _ACCA
    nop
    nop
    cbi  PortD, LED.p_RTCclk
    dec _ACCB
    brne  LED.cmdloop1

    lds  _ACCA, LED.RTCdata
    ldi  _ACCB, 8

    LED.dataloop1:    ; Data-Byte rausschieben
    sbrs _ACCA,0 // Bit low?
    cbi  PortD, LED.p_RTCio
    sbrc _ACCA,0 // Bit high?
    sbi  PortD, LED.p_RTCio
    sbi  PortD, LED.p_RTCclk
    lsr  _ACCA
    nop
    nop
    cbi  PortD, LED.p_RTCclk
    dec _ACCB
    brne  LED.dataloop1

    cbi  PortD, LED.p_RTCrst
  endasm;
  DDRD:=  DDRDinitRdRTC;       {PortD dir}
end;

procedure ShiftRTCin;  // für externe RTC DS1302 oder HT1381
begin
  DDRD:=  DDRDinitWrRTC;       {PortD dir}
  PortD:= PortDinit;           {PortD}
  asm;
    sbi  PortD, LED.p_RTCrst
    lds  _ACCA, LED.RTCcmd
    lsl  _ACCA        // wg. RW-Bit Adresse eins nach links
    ori  _ACCA,$81    // MSB auf 1
    ldi  _ACCB, 8
    LED.cmdloop2:    ; Cmd-Byte rausschieben
    sbrs _ACCA,0 // Bit low?
    cbi  PortD, LED.p_RTCio
    sbrc _ACCA,0 // Bit high?
    sbi  PortD, LED.p_RTCio
    sbi  PortD, LED.p_RTCclk
    lsr  _ACCA
    nop
    nop
    cbi  PortD, LED.p_RTCclk
    dec _ACCB
    brne  LED.cmdloop2
  endasm;
  DDRD:=  DDRDinitRdRTC;       {PortD dir}
  asm;
    ldi  _ACCB, 7
    LED.dataloop2:    ; Data-Byte reinschieben
    clc
    sbic PinD, LED.p_RTCio // Bit gesetzt?
    sec
    sbi  PortD, LED.p_RTCclk
    nop
    nop
    ror _ACCA  // Carry-Bit einschieben
    cbi  PortD, LED.p_RTCclk
    dec _ACCB
    brne  LED.dataloop2
    cbi  PortD, LED.p_RTCrst
    lsr _ACCA
    sts LED.RTCdata,_ACCA ; Daten-Byte
  endasm;
end;

procedure GetExtRTC;
begin
  RTCcmd:=2;
  ShiftRTCin;
  Hour:=BCDtoByte(RTCdata);
  RTCcmd:=1;
  ShiftRTCin;
  Minute:=BCDtoByte(RTCdata);
  RTCcmd:=0;
  ShiftRTCin;
  Second:=BCDtoByte(RTCdata);
  RTCcmd:=3;
  ShiftRTCin;
  Day:=BCDtoByte(RTCdata);
  RTCcmd:=4;
  ShiftRTCin;
  Month:=BCDtoByte(RTCdata);
  RTCcmd:=6;
  ShiftRTCin;
  Year:=BCDtoByte(RTCdata);
end;

procedure SetExtRTC;
begin
  RTCcmd:=7;
  RTCdata:=0;
  ShiftRTCout;
  RTCcmd:=2;
  RTCdata:=ByteToBCD(Hour);
  ShiftRTCout;
  RTCcmd:=1;
  RTCdata:=ByteToBCD(Minute);
  ShiftRTCout;
  RTCcmd:=0;
  RTCdata:=ByteToBCD(Second);
  ShiftRTCout;
  RTCcmd:=3;
  RTCdata:=ByteToBCD(Day);
  ShiftRTCout;
  RTCcmd:=4;
  RTCdata:=ByteToBCD(Month);
  ShiftRTCout;
  RTCcmd:=6;
  RTCdata:=ByteToBCD(Year);
  ShiftRTCout;
  RTCcmd:=7;
  RTCdata:=128;
  ShiftRTCout;
end;
{$ENDIF}

procedure GetRTC;
begin
  disableints;
  Hour:=RTCgethour;
  Minute:=RTCgetminute;
  Second:=RTCgetsecond;
  Day:=RTCgetday;
  Month:=RTCgetmonth;
  Year:=RTCgetyear;
  enableints;
end;

procedure SetRTC;
begin
  disableints;
  RTCsethour(Hour);
  RTCsetminute(Minute);
  RTCsetsecond(Second);
  RTCsetday(Day);
  RTCsetmonth(Month);
  RTCsetyear(Year);
  enableints;
{$IFDEF EXTRTC}
  SetExtRTC;
{$ENDIF}
end;

procedure DateTimeToDOS;
{ DOS time format bits:
DOStime: 15..11=Hours (0-23), 10..5=Minutes (0-59), 4..0=Seconds/2 (0-29)
DOSdate: 15..9=Year (0=1980, 127=2107), 8..5=Month (1=January, 12=December),
4..0=Day (1-31) }
begin
  GetRTC;
  DOStime:=(word(Hour) shl 11) or (word(Minute) shl 5) or (word(Second) shr 1);
  DOSdate:=(word(Year+20) shl 9) or (word(Month) shl 5) or (word(Day));
end;

procedure TimeToParamStr;
begin
  ParamStr:=byteToStr(Hour:2:'0')+':'+byteToStr(Minute:2:'0')+':'+byteToStr(Second:2:'0');
end;

procedure DateToParamStr;
begin
  ParamStr:=byteToStr(Day:2:'0')+'.'+byteToStr(Month:2:'0')+'.'+byteToStr(Year:2:'0');
end;

