[Return to Main Page]

Day of the Week by Paul Guertin
[Up to Source Code Repository]

Day of the Week

How to compute the day of the week in 6502 assembly.
By Paul Guertin (pg@sff.net), 18 August 2000.

    * This routine works for any date from 1900-03-01 to 2155-12-31.
    * No range checking is done, so validate input before calling.
    *
    * I use the formula
    *     Weekday = (day + offset[month] + year + year/4 + fudge) mod 7
    * where the value of fudge depends on the century.
    *
    * Input: Y = year (0=1900, 1=1901, ..., 255=2155)
    *        X = month (1=Jan, 2=Feb, ..., 12=Dec)
    *        A = day (1 to 31)
    *
    * Output: Weekday in A (0=Sunday, 1=Monday, ..., 6=Saturday)

    TMP      EQU $6          ; Temporary storage

    WEEKDAY:
             CPX #3          ; Year starts in March to bypass
             BCS MARCH       ; leap year problem
             DEY             ; If Jan or Feb, decrement year
    MARCH    EOR #$7F        ; Invert A so carry works right
             CPY #200        ; Carry will be 1 if 22nd century
             ADC MTAB-1,X    ; A is now day+month offset
             STA TMP
             TYA             ; Get the year
             JSR MOD7        ; Do a modulo to prevent overflow
             SBC TMP         ; Combine with day+month
             STA TMP
             TYA             ; Get the year again
             LSR             ; Divide it by 4
             LSR
             CLC             ; Add it to y+m+d and fall through
             ADC TMP
    MOD7     ADC #7          ; Returns (A+3) modulo 7
             BCC MOD7        ; for A in 0..255
             RTS
    MTAB     DB 1,5,6,3,1,5,3,0,4,2,6,4   	; Month offsets

Last page update: September 2, 2000.