10 REM > Z80.ProgTips.DofWeek
   20 REM Calculate day of week
   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