;******************************************************************
;* *
;* Day_of_Week, 2000-2099 Mike McLaren, K8LH, Aug '07 *
;* *
;* params: Month (1..12), Day (1..31), Year (0..99) *
;* output: W = 0..6 (Sun..Sat) *
;* *
;* 34 words (14 bit core) *
;******************************************************************
radix dec
;
; char Month; // 1..12
; char Day; // 1..31
; char Year; // 0..99 (2000-2099)
;
; char DayOfWeek()
; { // returns 0..6 (Sun..Sat)
; char Leap;
; rom Y2K[] = { 5, 1, 1, 4, 6, 2, 4, 0, 3, 5, 1, 3 };
;
; Leap = (Year & 3) || (Month > 2);
; return (Y2K[Month-1] + Day + Leap + Year + Year/4) % 7;
; }
;
DayOfWeek_1
clrf Leap ; Leap = 0 |B0
movf Month,W ; W = Month (1..12) |B0
addlw -3 ; C = 0 if Jan or Feb |B0
movf Year,W ; W = Year (0..99) |B0
andlw b'00000011' ; is this a leap year? |B0
skpz ; yes, skip, else |B0
setc ; set C (will force Leap = 1) |B0
rlf Leap,F ; Leap = 0 or 1 |B0
decf Month,W ; W = Month-1 (0..11) index |B0
[COLOR=Blue]addwf PCL,F ; get Y2K[Month-1] array element |B0
Y2K xorlw 5^00^(1^01) ; 6 (Jan 2000) |B0
xorlw 1^01^(1^02) ; 2 (Feb) |B0
xorlw 1^02^(4^03) ; 2 (Mar) |B0
xorlw 4^03^(6^04) ; 5 (Apr) |B0
xorlw 6^04^(2^05) ; 0 (May) |B0
xorlw 2^05^(4^06) ; 3 (Jun) |B0
xorlw 4^06^(0^07) ; 5 (Jul) |B0
xorlw 0^07^(3^08) ; 1 (Aug) |B0
xorlw 3^08^(5^09) ; 4 (Sep) |B0
xorlw 5^09^(1^10) ; 6 (Oct) |B0
xorlw 1^10^(3^11) ; 2 (Nov) |B0
xorlw 3^11 ; 4 (Dec) |B0[/COLOR]
; WREG = (((Y2K[Month-1]+Day+Leap)*2 + Year/2)/2 + Year) % 7
addwf Day,W ; add Day (1..31) |B0
addwf Leap,F ; add Leapday (0 or 1) |B0
rlf Leap,F ; multiply by 2 |B0
rrf Year,W ; divide year by 2 |B0
addwf Leap,F ; add 'em together |B0
rrf Leap,W ; divide result by 2 |B0
addwf Year,W ; add Year (0..99) |B0
Mod7a addlw -7 ; result % 7 |B0
bc Mod7a ; |B0
addlw 7 ; |B0
return ; |B0
;