\ Calculating the day of the week for a given date \ ================================================ \ mdfs.net/Info/Comp/6502/ProgTips/Date/DayOfWk16a - J.G.Harston \ \ On entry day = day, 1-31 \ month = month, 1-12 \ year+0,year+1 = year, 0-39999 \ On exit A=day of week 0=Sun, 6=Sat \ X=corrupted \ Y=corrupted \ Size 160 bytes, 4 bytes workspace \ 129 bytes if zero page workspace \ Speed faster than DayOfWk16a \ \ Uses the formula: \ if (m < 3) then y = y-1 \ return (y + y/4 - y/100 + y/400 + t[m-1] + d) mod 7 \ .DayOfWeek LDA day:LDX month CLC:ADC DofWOffsets-1,X:STA day :\ acc=t[m]+d, offset to prevent LDA #1:STA month :\ overflow with small numbers 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 zero .DayOfWeekSub1 DEC year+1 :\ Do a 16-bit decrement .DayOfWeekSub2 DEX:STX year+0 :\ year=year-1 : .DayOfWeekMarch JSR DayOfWeekAdd :\ acc=y+t[m]+d JSR DayOfWeekDiv4 :\ acc=y+y/4+t[m]+d LDX #255:SEC .DayOfWeekDiv100Lp LDA year+0:SBC #25:STA year+0 :\ Divide year/4 by 25 to get year/100 LDA year+1:SBC #00:STA year+1 INX:BCS DayOfWeekDiv100Lp STX year+0:INC year+1 :\ year=y/100 SEC:LDA day:SBC year+0:STA day :\ acc=y+y/4-y/100+t[m]+d LDA month:SBC #0:STA month JSR DayOfWeekDiv4 :\ acc=y+y/4-y/100+y/400+t[m]+d : TAY:LDX day .DayOfWeekMod7 TXA:PHA:SBC #7:TAX :\ A=(y+y/4-y/100+y/400+t[m]+d) MOD 7 TYA:SBC #0:TAY:PLA BCS DayOfWeekMod7 \ADC #1 :\ Include to return 1..7 RTS : .DayOfWeekDiv4 LSR year+1:ROR year+0 :\ y=y/4 LSR year+1:ROR year+0 .DayOfWeekAdd CLC:LDA day:ADC year+0:STA day :\ acc=acc+y or acc=acc+y/4 LDA month:ADC year+1:STA month RTS : .DofWOffsets EQUB 4:EQUB 0:EQUB 6:EQUB 2 :\ Month offsets EQUB 4:EQUB 0:EQUB 2:EQUB 5 EQUB 1:EQUB 3:EQUB 6:EQUB 1 : .year :EQUW 0 .month:EQUB 0 .day :EQUB 0 \ \ You can test this with: \ \ FOR Y%=0 TO 39999 \ 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% \