Aber wie kann ich die Zeitumstellung berechnen, oder Wochentage in Assembler?
Den Wochentag kannst Du mit
Zellers Kongruenz berechnen. Hier eine mögliche Lösung für die 16-Bit PICs.
;......................................................................................
; Subroutine: wochentag_sub
; Funktion: Berechnung des Wochentags nach Zellers Kongruenz,
; das Jahr wird in der Form 20yy vorrausgesetzt
; --> nur gültig für 1. März 2000 bis 31. Dezember 2099
;
; Parameter:
; w2: Tag, dd
; w3: Monat, mm
; w4: Jahr, yy
;
; verwendet: w0, w1, w2, w3, w4
;
; verändert: w0, w1
;
; Rückgabewert:
; w0: 0: Samstag, 1: Sonntag, 2: Montag, ... 6: Freitag
;......................................................................................
wochentag_sub:
push.d w2 ; w2 - w4 sichern
push w4
cp w3, #3 ; Monat > 2 ?
bra NN, 1f ; ja
add #12, w3 ; nein, Monat = Monat + 12
dec w4, w4 ; Jahr = Jahr - 1
1:
inc w3, w3 ; monat + 1
mul.uu w3, #26, w0 ; w0 = 26 * (monat+1)
; monat (w3) wird nicht mehr benötigt
mov #10, w3
repeat #17
div.u w0, w3 ; w0 = (26 * (monat+1)) / 10
add w2, w0, w0 ; w0 = Tag + ((26 * (monat+1)) / 10)
add w4, w0, w0 ; w0 = Tag + ((26 * (monat+1)) / 10) + Jahr
lsr w4, #2, w4 ; w4 = Jahr / 4
add w4, w0, w0 ; w0 = Tag + ((26 * (monat+1)) / 10) + Jahr + (Jahr/4)
add #5, w0 ; w0 = Tag + ((26 * (monat+1)) / 10) + Jahr + (Jahr/4) + (Jh/4)
sub #40, w0 ; w0 = Tag + ((26 * (monat+1)) / 10) + Jahr + (Jahr/4) + (Jh/4) - 2*Jh
; diese zwei Zeilen können natürlich zusammengefaßt werden
mov #7, w3
repeat #17
div.s w0, w3 ; w0 = (Tag + ((26 * (monat+1)) / 10) + Jahr + (Jahr/4) + (Jh/4) - 2*Jh) / 7
; w1 = (Tag + ((26 * (monat+1)) / 10) + Jahr + (Jahr/4) + (Jh/4) - 2*Jh) % 7
mov w1, w0 ; Rückgabewert, nur der Divisionsrest ist von Interesse
btsc w0, #15 ; Divisionsrest negativ?
add #7, w0 ; ja, also 7 addieren
pop w4 ; w2 - w4 wiederherstellen
pop.d w2
return
Die Berechnung des Wochentages kann man dann für die Sommer-/Winterzeit Umstellung verwenden, indem damit der letzte Sonntag im März/Oktober berechnet wird. Ausgehend von den obigen Werten (0=Samstag, 1=Sonntag, ...) ist das Datum des letzen Sonntags im Monat März/Oktober
31 - (Wochentag vom Monatsletzen - 1)wenn man für den Fall Samstag ("0") den Wochentagswert auf "7" setzt. Dann muß man nur noch mit dem aktuellen Datum vergleichen.
Viele Grüße
Bernd