summary refs log tree commit diff
path: root/date.s
diff options
context:
space:
mode:
authorWlodekM <[email protected]>2025-04-03 12:04:10 +0300
committerWlodekM <[email protected]>2025-04-03 12:04:10 +0300
commit570bb71bee1042d656cc121b45598bb1198e2df4 (patch)
treeea8e0e2bad1ee9796ac1486c5f5680767b47d342 /date.s
parent60732c4d90abe71d990ca00894f41b5078857a60 (diff)
some fixes
Diffstat (limited to 'date.s')
-rw-r--r--date.s36
1 files changed, 36 insertions, 0 deletions
diff --git a/date.s b/date.s
new file mode 100644
index 0000000..afd6717
--- /dev/null
+++ b/date.s
@@ -0,0 +1,36 @@
+;* 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