[comp.sys.handhelds] Daylight Saving Time program

lennartb@lne.kth.se (Lennart Boerjeson @ KTH/LNE, The Royal Inst. of Tech.) (08/17/90)

The following is a program which automatically, twice a year, switchs your
clock between daylight saving time and standard time. It is designed to be
used together with Eric Postpischil's timekeeping routines, install this
directory as a subdirectory in the directory where Eric's routines are.

It should also work without Eric's routines.

The time changes on the last Sunday of March and September, if this
isn't right for you, modify routine \->DSTDAY.

Some of the routines have borrowed ideas from Eric's routines. Give credit
where credit is due...

(Some may ask "Why have an alarm that'll only execute twice a year?"
 Well... maybe I'm a little bit lazy... I have had such a program in my
 HP-41 for years, and I have NEVER been late on those frosty mornings in
 spring, the day after DST starts...)

!++
! Lennart Boerjeson, System Manager
! School of Electrical Engineering
! Royal Institute of Technology
! S-100 44 Stockholm, Sweden
! tel: int+46-8-7907814
! Internet: lennartb@lne.kth.se
!--


@ DST Daylight Saving Time program - 'DST' BYTES -> #118Ch 1096.5
%%HP: T(3)A(R)F(,);
DIR
  STOAL		@ Store Alarm. Previous copies of same alarm are deleted.
		@ alarm -> 
    \<< \-> AL
      \<< RCLF -55 SF
        IFERR 1 \-> I
          \<<
            WHILE I RCLALARM
              IF AL SAME
              THEN I DELALARM 1
              ELSE 'I' INCR
              END
            REPEAT
            END
          \>>
        THEN
        END STOF AL STOALARM DROP
      \>>
    \>>
  DSTDO		@ Advance or delay clock, reschedule DST.
		@ ->
    \<< PATH SWAP HOME
      IF 'JOB' VTYPE 0 <
      THEN 29491200 * CLKADJ
      ELSE 'JOB' RCL 1 OVER SIZE 1 -
        SUB EVAL '1_h' \->UNIT ADJT
      END EVAL DSTSCHD
    \>>
  MKAL		@ Make DST alarm.
		@ -> alarm
    \<< DATE \->DST
      IF MM 3 SAME
      THEN 2 1
      ELSE 3 -1
      END
      "\<< IFERR DELALARM PATH " SWAP +
      " 'DSTJOB' RCL EVAL EVAL THEN ERRM END OFF \>>"
      + OBJ\-> 0 4 \->LIST
    \>>
  MM		@ Get month from date.
		@ date -> date mm
    \<< DUP
      IF -42 FS?
      THEN FP 100 *
      END IP
    \>>
  DSTSCHD	@ Schedule DST alarm and create DSTJOB path in HOME.
		@ ->
    \<< PATH HOME
      IF 'DSTJOB' VTYPE 0 <
      THEN DUP 'DSTDO' + 'DSTJOB' STO
      END EVAL MKAL STOAL
    \>>
  \->DST	@ Compute next DST day.
		@ date -> newdate
    \<< DUP \->DSTDAY
      IF DUP2 DDAYS 0 MAX NOT
      THEN ADDMONTH \->DSTDAY
      END SWAP DROP
    \>>
  ?DSTDAY	@ Is this date a Sunday?
		@ date -> date flag
    \<< DUP 0 TSTR 1 3 SUB "SUN" SAME
    \>>
  ADDMONTH	@ Add one month to date.
		@ date -> newdate
    \<< \->D1 31 DATE+ \->D1
    \>>
  \->D1		@ Reset date to day 1 of same month.
		@ date -> newdate
    \<<
      IF -42 FS?
      THEN FP 1 +
      ELSE DUP IP SWAP 100 * FP 1 + 100 / +
      END
    \>>
  ?DSTMONTH	@ Is this date in March or September?
		@ date -> date flag
    \<< MM DUP 3 SAME SWAP 9 SAME OR
    \>>
  \->DSTDAY	@ Compute next DST day. If starting month is DSTmonth, return
		@ same month (\->DST checks this case).
		@ date -> newdate
    \<<
      WHILE ?DSTMONTH NOT
      REPEAT ADDMONTH
      END ADDMONTH
      DO -1 DATE+
      UNTIL ?DSTDAY
      END
    \>>
  CST { }	@ Empty CST menu.
END
!++
! Lennart Boerjeson, System Manager
! School of Electrical Engineering
! Royal Institute of Technology
! S-100 44 Stockholm, Sweden
! tel: int+46-8-7907814
! Internet: lennartb@lne.kth.se
!--