Day of week - simondotm/stardot-wiki GitHub Wiki

Calculating the day of the week for a given date

\ Based on code at http://6502.org/source/misc/dow.htm by Paul Guertin.

\ This routine works for any date from 1900-03-01 to 2155-12-31.

\ No range checking is done, so validate input before calling.

\

\ It uses the formula

\     Weekday = (day + offset[month] + year + year/4 + fudge) mod 7

\ where the value of fudge depends on the century.

\

\ On entry, A=day, 1..31

\           X=month, 1..12

\           Y=year-1900, 0..255

\ On exit,  A=day of week 1..7 for Sun..Sat

.DayOfWeek

CPX #3:BCS dow_march    :\ Year starts in March to bypass leap year problem

DEY                     :\ If Jan or Feb, decrement year

.dow_march

EOR #&7F                :\ Invert A so carry works right

CPY #200                :\ Carry will be 1 if 22nd century

ADC dow_months-1,X      :\ A is now day+month offset

STA dow_tmp

TYA:JSR dow_mod7        :\ Get the year MOD 7

SBC dow_tmp:STA dow_tmp :\ Combine with day+month

TYA:LSR A:LSR A         :\ Get the year DIV 4

CLC:ADC dow_tmp         :\ Add it to y+m+d and fall through to MOD 7

.dow_mod7

ADC #7:BCC dow_mod7     :\ Reduce A to A MOD 7

ADC #0:RTS              :\ Increment to standard 1..7 range

.dow_months

EQUB 1:EQUB 5:EQUB 6:EQUB 3  :\ Month offsets

EQUB 1:EQUB 5:EQUB 3:EQUB 0

EQUB 4:EQUB 2:EQUB 6:EQUB 4

.dow_tmp

EQUB 0                  :\ Temporary storage

You can test this with:

FOR Y%=1 TO 255

FOR X%=1 TO 12

FOR A%=1 TO 31

PRINT A%;"/";X%;"/";1900+Y%;" ";

PRINT MID$("SunMonTueWedThuFriSat",((USRDayOfWeek)AND&FF)*3-2,3)

NEXT A%:NEXT X%:NEXT Y%

I must say that this is an impressive bit of code!

See http://mdfs.net/Info/Comp/6502/ProgTips

⚠️ **GitHub.com Fallback** ⚠️