10
20
30 :
40 DIM mc% 59
50 FOR P=0 TO 1
60 P%=mc%:O%=P%
70 [OPT P*3+4
80 \ On entry B =day, 1..31
90 \ C =month, 1..12
100 \ E =year-1900, 0..255
110 \ On exit A=day of week 0..6 for Sun..Sat, Carry will be Set
120 \ Needs incrementing with INC A after calling to
130 \ become standard 1..7 range
140 \ Size 51 bytes
150 \
160 .DayOfWeek
170 CALL DayOfWeek0:LD L,A:EXX:RET :\ Test entry
180 :
190 .DayOfWeek0
200 LD A,C:CP 3 :\ Is month March or later?
210 LD A,E :\ A=year for later
220 JR NC,dow_march :\ Start year in March make leap years easier
230 AND A:JR NZ,dow_1901:LD A,6 :\ Adjust for 1900 - include this line for Jan/Feb 1900
240 .dow_1901
250 DEC A:LD E,A :\ If Jan or Feb, decrement year
260 .dow_march
270 CP 2100-1900:CCF:SBC A,0 :\ Adjust for 2100 not a leap year
280 CALL dow_mod7 :\ Get year MOD 7 to prevent overflow
290 ADD A,B :\ A=day + year
300 SRL E:SRL E:ADD A,E :\ A=day + year + year/4
310 LD HL,dow_months-1 :\ HL=>month table
320 LD B,0:ADD HL,BC :\ HL=>month offset
330 ADD A,(HL) :\ A=day + offset[m] + year + year/4
340 .dow_mod7
350 ADD A,7:JR NC,dow_mod7
360 RET
370 .dow_months
380 DEFB 2:DEFB 5:DEFB 4:DEFB 0 :\ Month offsets
390 DEFB 2:DEFB 5:DEFB 0:DEFB 3
400 DEFB 6:DEFB 1:DEFB 4:DEFB 6
410 ]NEXT
420 DEFFNday(A%):=MID$("000SunMonTueWedThuFriSat",A%*3+1,3)
430 FOR C%=1 TO 12
440 FOR B%=1 TO 31
450 U%=USR DayOfWeek:PRINT B%;"/";C%;"/";1900+E%;" - ";FNday(1+(U% AND 255));" ";~U%
460 NEXT
470 NEXT