SMOLNET PORTAL home about changes
      TEXAS 2-STEP TO CALCULATE THE DAY OF THE WEEK FROM 1901 TO 2099
              - based on Hans Lachman's Method of Conversion -


 Strictly adhering to Lachman's Maxim (Complexity is a diseconomy of scale)
 a reworking of Hans' Method has been coded as a stand-alone function when
 your only recourse is to call a 68k Asm program via AMS on TI calculators:
 i.e. no values looked up in tables, files or libraries when executing, no
 kernel, no system calls, no exception processing, maximal registers to be
 used with no need to save any. It is for valid Gregorian dates from 1901,
 as of New Year's Day, to New Year's Eve 2099 A.D.

 Although using as unsophisticated a processor as a 68k on programmable TI
 calculators, this reworking of Hans' Method is more efficient than others.
 It succeeds where other methods do not when computing the day of the week
 on the lowliest 68k device: calculating the day-number in 16 arithmetic
 operations, while staying within the register limit for nostub routines. 
 
 The function below returns a day-number compatible with ISO 8601 when
 called with the following two absolute addresses: 
 
 ;  WDN, for copying the result from d0
 ; DATE, for a basic ISO-format date stamp CYmd as four base-100 bytes
 ;
 moveq #0,d0
 move.l DATE,d1
 move.l d1,d2
      ;
      ; APPLY STEP 1 - LACHMAN'S CONGRUENCE--MOD 100
      andi.l #$f00,d1
      divu #100,d1
      addi.b #94,d1 
      andi.l #$ff,d1
      divu #100,d1 ; MonthIndex in the upper word (mod100)
      ;
      ;                    APPLY STEP 2
      swap d1 ; MI
      add.b d2,d1 ; d + MI
      addi.l #$3fd00,d2
      lsl  #8,d2 ; under*2 mod7 - 1 in CCR's X-bit
      abcd d0,d0 ; under*2 mod7 - 1
      rol #6, d2 ; QR/4 + 1 in d2.b
      add.w DATE,d2 ; Y + QR/4 + 1   in d2.b
      add.b d2,d0 ; Y + QR/4 + under*2 mod7 
      add.w d1,d0 ; d + MI + Y + QR/4 + under*2 mod7
      ;
      divu #7,d0 
      swap d0 ;  d0.w becomes the day-number
 ;
 ;    RETURN THE DAY-NUMBER TO LOCATION WDN
 move.w d0,WDN
 rts
 ;
 ;       Days of the week correspond to day-numbers as:
 ;        Sun=0  Mon=1  Tue=2  Wed=3  Thu=4  Fri=5  Sat=6

 Inputs are to be passed in the proper format:
 No component of a Date may be passed as a pair of base 10 nibbles.

--

      REFERENCE

gopher://gopherite.org/0/users/retroburrowers/TemporalRetrology/cc/g4
Response: text/plain
Original URLgopher://sdf.org/0/users/retroburrowers/TemporalRetrology/68k/min
Content-Typetext/plain; charset=utf-8