\ Calculating the day of the week for a given date \ ================================================ \ mdfs.net/Info/Comp/6502/ProgTips/Date/DayOfWk16b - J.G.Harston \ \ This routine works for any date from 0000-01-01 to 65535-12-31. \ No range checking is done, so validate input before calling. \ \ On entry day = day, 1-31 \ month = month, 1-12 \ year+0,year+1 = year, 0-65535 \ On exit A=day of week 0=Sun, 6=Sat \ X=corrupted \ Y=preserved \ Size 139 bytes, 4 bytes workspace \ 116 bytes if zero page workspace \ Speed slower than DayOfWk16a \ \ Uses the formula: \ if (m < 3) then y = y-1 \ return (y + y/4 - y/100 + t[m-1] + d + fudge) mod 7 \ where fudge is an adjustment for year n*400+0 \ .DayOfWeek SEC:LDX year+0:LDY year+1 .DayOfWeekMod400 TXA:SBC #400 AND 255:TAX :\ Get year MOD 400 TYA:SBC #400 DIV 256:TAY BCS DayOfWeekMod400 TXA:ADC #400 AND 255:STA year+0 TYA:ADC #400 DIV 256:STA year+1 LDA day:LDX month : \ Enter here with A=day, X=month, year=year MOD 400 .DayOfWeek1 CLC:ADC DofWOffsets-1,X:STA day :\ t[m]+d CPX #3:BCS DayOfWeekMarch :\ March or later : LDX year+0:BNE DayOfWeekSub2 :\ Year>255 LDA year+1:BNE DayOfWeekSub1 :\ Not year n*400+0 LDX #5:INC year+1 :\ Adjust for year n*400+0 .DayOfWeekSub1 DEC year+1 :\ Do a 16-bit decrement .DayOfWeekSub2 DEX:STX year+0 :\ year=year-1 : .DayOfWeekMarch LDA year+1:LSR A LDA year+0:ROR A:LSR A:PHA :\ A=year/4 CLC:ADC day:STA day :\ y/4+t[m]+d : LDX #1:PLA:SEC .DayOfWeekDiv100 DEX:SBC #25:BCS DayOfWeekDiv100 :\ X=-(year/100) TXA:ADC day :\ y/4-y/100+t[m]+d : CLC:ADC year+0:TAX :\ y+y/4-y/100+t[m]+d LDA year+1:ADC #0:TAY:SEC .DayOfWeekMod7 TXA:PHA:SBC #7:TAX :\ (y+y/4-y/100+t[m]+d) MOD 7 TYA:SBC #0:TAY:PLA BCS DayOfWeekMod7 \ADC #1 :\ Include to return 1..7 RTS : .DofWOffsets EQUB 0:EQUB 3:EQUB 2:EQUB 5 :\ Month offsets EQUB 0:EQUB 3:EQUB 5:EQUB 1 EQUB 4:EQUB 6:EQUB 2:EQUB 4 \ .year :EQUW 0 .month:EQUB 0 .day :EQUB 0 \ \ You can test this with: \ \ FOR Y%=0 TO 65535 \ FOR X%=1 TO 12 \ FOR A%=1 TO 31 \ !year=Y%:?month=X%:?day=A% \ PRINT A%;"/";X%;"/";Y%;" "; \ PRINT MID$("SunMonTueWedThuFriSat",((USRDayOfWeek) AND &FF)*3+1,3) \ NEXT A%:NEXT X%:NEXT Y% \