.TITLE DOW .IDENT /V1.0/ ; ; DAY OF WEEK FROM DATE (SEPTEMBER 1979 BYTE, PAGE 126) ; ; INPUT TO THIS SUBROUTINE IS A POINTER WHICH WILL BE PASSED ; REGISTER R0. THIS POINTER WILL POINT TO THE START OF A ; STANDARD TIME BLOCK (AS RETURNED BY GTIM$). ON RETURN R0 ; WILL CONTAIN d (SEE BELOW) FOR THE DAY OF THE WEEK, WHERE ; ZERO = SUNDAY AND SIX = SATURDAY. ; ; NOTICE TO PROGRAMMERS: IT IS ASSUMED THAT THIS PROGRAM WILL BE RUN ; EXCLUSIVELY IN THE 20TH CENTURY. IF BY SOME TWIST OF FATE THIS PROGRAM ; IS STILL BEING USED AFTER JAN. 1, 2000, THEN YOU WILL NEED TO CHANGE ; THE ASSUMED CONSTANT INT[19/4]. ; ; THE ALGORITHM IS AS FOLLOWS: ; ; d = {INT[2.6m-0.2]+K+Y+INT[Y/4]+INT[C/4]-2C} MOD 7 ; ; WHERE: d IS THE DAY OF THE WEEK (0=SUN, 1=MON, ETC) ; m IS CALCULATED MONTH NO. - 2 (JAN=11, FEB=12; Y=YEAR-1) ; K IS DAY OF MONTH ; Y IS YEAR OF CENTURY (SEE NOTE ABOVE FOR m) ; C IS INT(CENTURY/100) (FOR 1900, C IS 19) ; ; DOW:: MOV R2,-(SP) ; SAVE REGISTERS MOV R3,-(SP) MOV R5,-(SP) ; MOV G.TIYR(R0),R5 ; GET YEAR SINCE 1900 MOV G.TIMO(R0),R3 ; GET MONTH NUMBER ; SUB #2,R3 ; SUBTRACT 2 FROM MONTH NUMBER BGT MULMON ; MUST HAVE BEEN 3 THRU 12 - BRANCH ; ADD #12.,R3 ; MAKE MONTH NOV OR DEC DEC R5 ; OF PREV YEAR ; MULMON: MUL #26.,R3 ; MULTIPLY MONTH NUMBER BY 26 SUB #2.,R3 ; SUBTRACT 2 CLR R2 ; SET UP FOR DIVIDE DIV #10.,R2 ; R2 HAS INT[2.6m-0.2] HERE ; ADD G.TIDA(R0),R2 ; ADD DAY ADD R5,R2 ; ADD YEAR ; ASR R5 ; DIVIDE YEAR BY 4 ASR R5 ; ADD R5,R2 ; ADD INT[Y/4] ; SUB #34.,R2 ; ADD INT[C/4]-2*C ; MOV R2,R3 ; SET UP FOR MOD-7 DIVIDE CLR R2 DIV #7.,R2 ; R2 <- QUOTIENT, R3 <- MOD-7 ; MOV R3,R0 ; PUT ANSWER IN R0 ; MOV (SP)+,R5 ; RESTORE REGISTERS MOV (SP)+,R3 MOV (SP)+,R2 ; RETURN ; .END