ebergman@isis.cs.du.edu (Eric Bergman-Terrell) (11/18/90)
HP 48SX Calendar Utilities Copyright (C) 1990 Eric Bergman-Terrell All Rights Reserved This article cannot be published without written permission of the author. 1 Introduction Hewlett Packard's HP 48SX programmable calculator has many powerful commands for performing date calculations. This article presents several programs that use the HP 48SX's date commands to: o Perform date / Julian day number conversions o Calculate the day of the week for a given date o Calculate the date of Easter o Generate calendars o Automatically adjust the HP 48SX clock for daylight savings time The programs can be used on a stand-alone basis or can be incorporated into your own programs. To type in and use the programs in this article, you must have a basic familiarity with the use of the HP 48SX. For further information on using the HP 48SX, refer to the HP 48SX Owner's Manual. The programs in this article are public domain, and can be freely distributed. This article, however, is copyrighted and cannot be published without written permission of the author. Please send comments, corrections, etc. to the address given in section 14 on page 17. 2 Conventions Whenever possible, the conventions of HP 48SX Owner's Manual are used. Throughout this article "ORANGE" means the left-shift key, and "BLUE" means the right-shift key. 3 Preparations Before you type in the programs in this article, you should set the calculator's date format and create a subdirectory for the programs, as described below. - 2 - 3.1 Date Format The HP 48SX supports two date formats, MM/DD/YY and DD.MM.YY. While the programs in this article will work with either date format, the examples all assume that MM/DD/YY format is in use. To make sure that your HP 48SX is in MM/DD/YY format, type the following: 42 +/- ENTER CF For more information about date formats, see the HP 48SX Owner's Manual, Volume I pp. 441, 442. 3.2 A Subdirectory for the Programs It is a good idea to save all programs in this article in one subdirectory. Create a subdirectory named 'CAL' to contain the programs that you will type in: BLUE HOME ' CAL ORANGE MEM CRDIR For more information about subdirectories, see the HP 48SX Owner's Manual, Volume I pp. 118 - 124. 4 Converting Dates to Date Numbers The HP 48SX expresses dates as real numbers in one of two formats: MM/DD/YY or DD.MM.YY (see HP 48SX Owner's Manual, Volume I p. 441). Program PKD converts a month, day, and year into a date number using the current date format. PKD (Convert Month, Day, and Year to Date Number) +-----------------------+------------------------+ | Arguments | Results | |-----------------------+------------------------| | 3: day | 3: | |-----------------------+------------------------| | 2: month | 2: | |-----------------------+------------------------| | 1: year | 1: date number | +-----------------------+------------------------+ - 3 - Program: Comments: \<< \-> M D Y If system flag -42 is \<< Y 1000000 / clear, date format is IF -42 FC? MM/DD/YY. Otherwise THEN D 100 / M date format is ELSE M 100 / D DD.MM.YY END + + \>> \>> ENTER ' PKD STO (Store the program in the 'CAL' subdirectory). Checksum: # 40794d Bytes: 138 Example: Convert the date 3/2/1963 to a date number. 3 ENTER 2 ENTER 1963 ENTER PKD +----------------------+ |4: | |3: | |2: | |1: 3.021963| +----------------------+ 5 Converting Date Numbers to Dates Program UPKD converts a date number to the corresponding month, day, and year. UPKD (Convert Date Number to Month, Day, and Year) +-----------------------+------------------------+ | Arguments | Results | |-----------------------+------------------------| | 3: | 3: month | |-----------------------+------------------------| | 2: | 2: day | |-----------------------+------------------------| | 1: date number | 1: year | +-----------------------+------------------------+ - 4 - Program: Comments: \<< \-> D Convert date number to \<< D day, month, and year. IF -42 FC? THEN IP D FP 100 * ELSE FP 100 * IP D END IP D 100 * FP 10000 * \>> \>> ENTER ' UPKD STO (Store the program in the 'CAL' subdirectory). Checksum: # 31313d Bytes: 148.5 Example: Convert the date number 3.021963 to the corresponding month, day, and year. 3.021963 ENTER UPKD +----------------------+ |4: | |3: 3| |2: 2| |1: 1963| +----------------------+ 6 Converting Date Numbers to Julian Day Numbers The Julian day number for a date is the number of days since Greenwich mean noon January 1, 4713 B.C. and that date. When dates are expressed as Julian day numbers date calculations are often much simpler. Consequently many programs that perform date calculations express dates as Julian day numbers. The following program converts a date number to the corresponding Julian day number. It is used in several of the programs in this article. JD (Date to Julian Day Number Conversion) +-----------------------+------------------------+ | Arguments | Results | |-----------------------+------------------------| | 1: date number | 1: Julian day number | +-----------------------+------------------------+ - 5 - Program: Comments: \<< 1 1 1583 PKD SWAP DDAYS 2299238.5 + \>> ENTER ' JD STO (Store the program in the 'CAL' subdirectory). Checksum: # 37291d Bytes: 56.5 Example: Calculate the Julian day number for 3/2/1963. 3 ENTER 2 ENTER 1963 ENTER PKD JD +----------------------+ |4: | |3: | |2: | |1: 2438090.5| +----------------------+ 7 Converting Julian Day Numbers to Date Numbers The following program is the inverse of program JD - given a Julian day number it calculates the corresponding date number. CD (Julian Day Number to Calendar Date Conversion) +-----------------------+------------------------+ | Arguments | Results | |-----------------------+------------------------| | 1: Julian day number | 1: date number | +-----------------------+------------------------+ Program: Comments: \<< 2299238.5 - 1 1 1583 PKD SWAP DATE+ \>> ENTER ' CD STO (Store the program in the 'CAL' subdirectory). Checksum: # 54424d Bytes: 56.5 Example: Calculate the date number for Julian day number 2438090.5. - 6 - 2438090.5 ENTER CD +----------------------+ |4: | |3: | |2: | |1: 3.021963| +----------------------+ 8 Limitations of Date Calculations The programs in this article are only valid for 1583 and later. This limitation exists because the Gregorian calendar system was adopted in 1582. 9 Calculating the Day of the Week The following program calculates the day of the week for a given date. DOW (Day of Week Calculation) +-----------------------+------------------------+ | Arguments | Results | |-----------------------+------------------------| | 1: date number | 1: day of week | +-----------------------+------------------------+ Program: Comments: \<< JD 1.5 + 7 MOD 1 1 = Sunday, + 2 = Monday, ..., \>> 7 = Saturday ENTER ' DOW STO (Store the program in the 'CAL' subdirectory). Checksum: # 45064d Bytes: 46 - 7 - Example: Calculate the day of the week of 3/2/1963. 3 ENTER 2 ENTER 1963 ENTER PKD DOW +----------------------+ |4: | |3: | |2: | |1: 7| +----------------------+ 3/2/1963 was a Saturday. 10 Calculating the Date of Easter Easter is defined as the Sunday after the first full moon occurring immediately after the Spring equinox. The following program computes the date of Easter for a given year. EASTER (Calculate the Date of Easter) +-----------------------+------------------------+ | Arguments | Results | |-----------------------+------------------------| | 1: year | 1: date of Easter | +-----------------------+------------------------+ - 8 - Program: Comments: \<< 0 0 0 0 0 0 0 0 0 There is a great deal 0 0 0 0 \-> Y A B C D of astronomy hidden E F G H I K L M N in these simple \<< Y 19 MOD 'A' calculations! STO Y 100 / IP 'B' STO Y 100 MOD 'C' This program is based STO B 4 / 'D' STO B on a method given in 4 MOD 'E' STO B 8 + "Astronomical Formulae 25 / IP 'F' STO B F for Calculators" (see - 1 + 3 / IP 'G' section 13 on page STO 19 A * B + D - 16). G - 15 + 30 MOD 'H' STO C 4 / IP 'I' STO C 4 MOD 'K' STO 32 2 E * + 2 I * + H - K - 7 MOD 'L' STO A 11 H * + 22 L * + 451 / IP 'M' STO H L + 7 M * - 114 + DUP SWAP 31 / IP 'N' STO 31 MOD 1 + N SWAP Y PKD \>> \>> ENTER ' EASTER STO (Store the program in the 'CAL' subdirectory). Checksum: # 25112d Bytes: 695 Example: Calculate the date of Easter for 1990. 1990 ENTER EASTER +----------------------+ |4: | |3: | |2: | |1: 4.15199| +----------------------+ In 1990, Easter occurs on April 15. 11 Generating Calendars Section 11.2 on page 12 and section 11.3 on page 13 contain programs for generating calendars. The calendar programs use some support programs, which are given below. - 9 - 11.1 Support Programs 11.1.1 Calculating the Number of Days in a Month The following program calculates the number of days in a given month. DIM (Number of Days in a Month) +-----------------------+------------------------+ | Arguments | Results | |-----------------------+------------------------| | 2: month | 2: | |-----------------------+------------------------| | 1: year | 1: # of days in month | +-----------------------+------------------------+ Program: Comments: \<< \-> M Y Calculate date of the \<< M 1 Y PKD first day of the next IF M 12 < month, incrementing THEN M 1 + 1 Y the year if necessary. ELSE 1 1 Y 1 + Then calculate the END PKD DDAYS number of days between \>> the dates. \>> ENTER ' DIM STO (Store the program in the 'CAL' subdirectory). Checksum: # 19326d Bytes: 129.5 Example: Program DIM is used in section 11.2 on page 12. 11.1.2 Displaying Stack Contents Program DSTK takes all character strings on the stack and displays them on the display screen. DSTK (Display Stack Contents) +-----------------------+------------------------+ | Arguments | Results | |-----------------------+------------------------| | item 1 | | |-----------------------+------------------------| | ... | | |-----------------------+------------------------| | 2: item N | 2: | |-----------------------+------------------------| | 1: print flag | 1: | +-----------------------+------------------------+ - 10 - If print flag is 0, the stack contents will be displayed on the display screen. If print flag is 1, the stack contents will be printed on the printer. Program: Comments: \<< { } \-> P L \<< CLLCD -37 CF Clear display screen. DEPTH \->LIST 'L' STO Place stack in list. 1 L SIZE FOR I L I GET I Display each element DISP of list. IF P if print flag is 1... THEN L I GET PR1 CR DROP END NEXT IF P NOT Wait for user to press THEN 0 WAIT any key. DROP Remove key value from END stack. \>> \>> ENTER ' DSTK STO (Store the program in the 'CAL' subdirectory). Checksum: # 20574d Bytes: 173 Example: Program DSTK is used in section 11.2 on page 12. 11.1.3 Padding a Character String The following program adds spaces to the left hand side of a character string until the string reaches the desired length. PAD (Pad a Character String) +-----------------------+------------------------+ | Arguments | Results | |-----------------------+------------------------| | 2: character string | 2: | |-----------------------+------------------------| | 1: desired length | 1: padded string | +-----------------------+------------------------+ - 11 - Program: Comments: \<< \-> S W \<< S WHILE DUP SIZE While not at desired W < length, add space to REPEAT " " SWAP beginning of string. + END \>> \>> ENTER ' PAD STO (Store the program in the 'CAL' subdirectory). Checksum: # 44762d Bytes: 74 Example: Program PAD is used in section 11.2 on page 12. 11.2 Generating a One Month Calendar The following program generates a calendar for a given month on the display screen or on a printer. MCAL (One Month Calendar) +-----------------------+------------------------+ | Arguments | Results | |-----------------------+------------------------| | 3: month | 3: | |-----------------------+------------------------| | 2: year | 2: | |-----------------------+------------------------| | 1: print flag | 1: | +-----------------------+------------------------+ Note: the stack must be empty before MCAL is run. If print flag is 0, the calendar will be displayed on the display screen. If print flag is 1, the calendar will be printed on the printer. - 12 - Program: Comments: \<< "" 0 \-> M Y P S B \<< STD " SU M TU W TH F SA" Label the columns. M 1 Y PKD 'B' STO "" B DOW 1 - 3 * Start first day under PAD 'S' STO 1 M Y correct column. DIM For each day of month, START S B UPKD place each day under DROP SWAP DROP \->STR correct column. 3 PAD + 'S' STO IF B DOW 7 == If Saturday, go to THEN S "" 'S' next line after day STO number is displayed. END B 1 DATE+ Advance to next day. 'B' STO NEXT S P DSTK Display calendar \>> on display screen \>> or printer. ENTER ' MCAL STO (Store the program in the 'CAL' subdirectory). Checksum: # 9559d Bytes: 320 Example: Generate a calendar for January, 1990 on the display screen. BLUE CLR 1 ENTER 1990 ENTER 0 ENTER MCAL +----------------------+ | SU M TU W TH F SA | | 1 2 3 4 5 6 | | 7 8 9 10 11 12 13 | | 14 15 16 17 18 19 20 | | 21 22 23 24 25 26 27 | | 28 29 30 31 | +----------------------+ 11.3 Generating a One Year Calendar Program YCAL generates a one year calendar on a printer (not on the display screen). YCAL (One Year Calendar) +-----------------------+------------------------+ | Arguments | Results | |-----------------------+------------------------| | 1: year | 1: | +-----------------------+------------------------+ Note: the stack must be empty before YCAL is run. - 13 - Program: Comments: \<< \-> Y \<< 1 12 For each month... FOR M M \->STR Print month/year. "/" + Y \->STR + PR1 CR DROP M Y 1 MCAL Print calendar for CR CR current month. NEXT \>> \>> ENTER ' YCAL STO (Store the program in the 'CAL' subdirectory). Checksum: # 21199d Bytes: 109.5 Example: Print a calendar for 1990. BLUE CLR 1990 ENTER YCAL The calendar will be printed on your printer. 12 Daylight Savings Time The daylight savings adjustment program uses one support program, which is given below: 12.1 Support Program SETCLK (Set Clock One Hour Forward or Backward) +-----------------------+------------------------+ | Arguments | Results | |-----------------------+------------------------| | 1: increment | 1: | +-----------------------+------------------------+ Program: Comments: \<< 8192 * 3600 * Set clock forward CLKADJ DATE or back. FINDALARM DELALARM Delete alarm. \>> ENTER ' SETCLK STO (Store the program in the 'CAL' subdirectory). Checksum: # 26754d Bytes: 56.5 Example: Program SETCLK is used in section 12.2 on page 14. - 14 - 12.2 Daylight Savings Time Adjustment Program Unless you live in a state that does not use daylight savings time, you must set your clocks ahead one hour on the first Sunday of April and set them back one hour on the last Sunday in October. The same applies to the clock in your HP 48SX, which is not automatically adjusted for daylight savings time. The following program will automatically adjust your calculator's clock twice a year, every year. While this program will only work for U.S.A. daylight savings time, it can be modified to work elsewhere. DST (Automatic Daylight Savings Time Adjustment) +-----------------------+------------------------+ | Arguments | Results | |-----------------------+------------------------| | 1: | 1: | +-----------------------+------------------------+ Note: the calculator does NOT need to be on when daylight savings begins or ends in order for the clock adjustment to be done. - 15 - Program: Comments: \<< 0 0 \-> Y D \<< DATE 100 * FP Get current year. 10000 * 'Y' STO 4 1 Start on April 1 and Y PKD 'D' STO search for first Sunday. WHILE D DOW 1 \=/ REPEAT D 1 DATE+ 'D' STO END If daylight savings IF DATE D < has not started this THEN D 2 year, schedule a program \<< 1 CAL to set the clock forward SETCLK one hour at 2:00 on the \>> 0 4 \->LIST first Sunday of April. STOALARM DROP END 10 31 Y PKD Start on October 31 and 'D' STO search for last Sunday WHILE D DOW 1 \=/ backwards. REPEAT D -1 DATE+ 'D' STO END If daylight savings IF DATE D < has not ended this THEN D 2 year, schedule a program \<< -1 CAL to set the clock back SETCLK one hour at 2:00 on \>> 0 4 \->LIST last Sunday of October. STOALARM DROP END 1 1 Y 1 + Schedule THIS program PKD 1 to run again next year \<< CAL DST 0 CAL so that the clock will SETCLK always be automatically \>> 0 4 \->LIST adjusted for daylight STOALARM DROP savings time. \>> \>> ENTER ' DST STO (Store the program in the 'CAL' subdirectory). Checksum: # 59525d Bytes: 479 Example: Run the DST program. DST 13 Further Reading The following books give methods for performing date calculations in addition to providing an introduction to astronomy programming. - 16 - [1] Jean Meeus, "Astronomical Formulae for Calculators", 4th ed., 1988 (Willmann-Bell) [2] Peter Duffett-Smith, "Practical Astronomy with your Calculator", 3rd ed., 1988 (Cambridge University Press) 14 About the Author Eric Bergman-Terrell is an author of articles about astronomy and computer science, as well as the program "Astronomy Lab" for IBM PC compatible computers. He can be reached at: Personal MicroCosms 8547 E. Arapahoe Road Suite J-147 Greenwood Village, CO 80112 USA - 17 - Contents 1 Introduction . . . . . . . . . . . . . . . . . 2 2 Conventions . . . . . . . . . . . . . . . . . . 2 3 Preparations . . . . . . . . . . . . . . . . . 2 3.1 Date Format . . . . . . . . . . . . . . . 3 3.2 A Subdirectory for the Programs . . . . . 3 4 Converting Dates to Date Numbers . . . . . . . 3 5 Converting Date Numbers to Dates . . . . . . . 4 6 Converting Date Numbers to Julian Day Numbers . 5 7 Converting Julian Day Numbers to Date Numbers . 6 8 Limitations of Date Calculations . . . . . . . 7 9 Calculating the Day of the Week . . . . . . . . 7 10 Calculating the Date of Easter . . . . . . . . 8 11 Generating Calendars . . . . . . . . . . . . . 9 11.1 Support Programs . . . . . . . . . . . 10 11.1.1 Calculating the Number of Days in a Month . . . . . . . . . . . . . . 10 11.1.2 Displaying Stack Contents . . . . 10 11.1.3 Padding a Character String . . . . 11 11.2 Generating a One Month Calendar . . . . 12 11.3 Generating a One Year Calendar . . . . 13 12 Daylight Savings Time . . . . . . . . . . . 14 12.1 Support Program . . . . . . . . . . . . 14 12.2 Daylight Savings Time Adjustment Program . . . . . . . . . . . . . . . . 15 13 Further Reading . . . . . . . . . . . . . . 16 14 About the Author . . . . . . . . . . . . . . 17 i
ebergman@isis.cs.du.edu (Eric Bergman-Terrell) (11/27/90)
Did anyone get "HP48SX Calendar Utilities" which I posted about a week ago? I don't know if my postings to comp.sys.handhelds are making it beyond my local node. Please let me know if it made it to your part of the world! Thanks, Terrell
EBERBERS%yubgef51@pucc.PRINCETON.EDU (11/28/90)
I haven't received anything like that. Zarko Berberski EBERBERS@YUBGEF51.bitnet
vaps0pb@prism.gatech.edu (Phillip Bridges) (11/29/90)
I didn't get the Calender Utilities here at GT, but there is the small chance that I simply missed it. ....Phil.....
kenw@col.hp.com (Ken Wyatt) (11/30/90)
I got it ok.....