[comp.sys.handhelds] HP48: Moon Phase Mods

NORM%IONAACAD.BITNET@CUNYVM.CUNY.EDU (Norman Walsh) (03/11/91)

Several weeks (months?) ago someone posted a directory of routines for
displaying the phase of the moon.  I humbly apologize for forgetting
who the original author was.  I have taken the liberty of making some
modifications, but I do NOT take any credit for the real guts of the
routines.  Any bugs in this posting should be considered my fault, not
the original poster's...

I have made basically two changes.  First, I have made it possible to
plot the phase of the moon for any date (not just today) and I have
added the ability to plot the phase of the moon over the course of
a month (again, for any date).  I don't know the limitations of the
moon phase calculations so I can't say for sure how wide a range of
dates can reasonably be expected to work accurately.

The following entry points are provided in a custom menu:

FRAC       - displays the percent of illumination and age of the moon
AGE        - displays the age of the moon and % illuminated (not quite
             the same as FRAC).
SHOW       - draws the lunar face.
GRAF       - plots the phase of the moon over the course of the month.
>DATE      - changes the moon phase date.  Expects a valid date in level 1
             of the stack.  Uses system date if the stack is empty.
>TIME      - changes the moon phase time.  Expects a valid time in level 1
             of the stack.  Uses system time if the stack is empty.
MCLK       - displays the current DATE and TIME.

If you would like more information about the actual programs in the
directory, just give a yell.
                                                          ndw


%%HP: T(3)A(D)F(.);
DIR
  CST { { "FRAC"
    \<< MFRAC
    \>> } { "AGE"
MTIME } { "SHOW"
MPHASE } { "GRAF"
MGRAPH } { ">DATE"
    \<<
      IF DEPTH 0 ==
      THEN DATE
      END 'PDATE'
STO
      IFERR 'PTIME'
RCL
      THEN 0
'PTIME' STO
      END DROP
    \>> } { ">TIME"
    \<<
      IF DEPTH 0 ==
      THEN TIME
      END 'PTIME'
STO
    \>> } { "MCLK"
    \<< PDATE "Date"
\->TAG PTIME "Time"
\->TAG
    \>> } }
  EQ M.EQ
  GETDATE
    \<<
      IF DEPTH 0 ==
      THEN
"Put MM.DDYYYY on stk"
DOERR
      END
      IF DEPTH 1 ==
      THEN TIME
      END \-> date
time
      \<< date DUP IP
0 > SWAP DUP IP 13
< SWAP FP 100 * IP
32 < AND AND
        IF NOT
        THEN
"Invalid date"
        ELSE time
'PTIME' STO date
'PDATE' STO
        END
      \>>
    \>>
  JDAT
    \<< 1.01198 PDATE
DDAYS 2444240 +
PTIME HMS\-> TMZN +
24 / +
    \>>
  LBL
    \<< \-> x y lbl
      \<< PICT x R\->B
y R\->B 2 \->LIST lbl 1
\->GROB GXOR
      \>>
    \>>
  M.EQ
    \<< PDATE DUP IP
SWAP 100 * FP 100 /
+ X IP 100 / +
'PDATE' STO X FP 24
* 'PTIME' STO MBASE
MB\->I
    \>>
  MBASE
    \<< 0 0 0 0 0 0
JDAT 2444239 - \-> M
ML MM EV AE A3 day
      \<< RAD day
.985647332099 * 360
MOD -3.762863 + 360
MOD D\->R 'M' STO 'E=
.016718*SIN(E)+M'
'E' M ROOT 2 / TAN
1.01686011182 *
ATAN R\->D 2 *
282.596403 + 360
MOD 'E' STO
13.1763966 day *
64.975464 + 360 MOD
DUP 'ML' STO
.1114041 day * -
349.383063 - 360
MOD 'MM' STO ML E -
2 * MM - D\->R SIN
1.2739 * 'EV' STO M
SIN DUP .1858 *
'AE' STO .37 * 'A3'
STO MM EV + AE - A3
- DUP D\->R SIN
6.2886 * SWAP 2 *
D\->R SIN .214 * SWAP
EV + ML + AE - +
DUP E - 2 * D\->R SIN
.6583 * + E -
      \>>
    \>>
  MB\->A
    \<< 360 MOD 360 /
    \>>
  MB\->I
    \<< D\->R COS NEG 1
+ 2 /
    \>>
  MDIR
    \<< MFRST RCLF
MBASE MB\->I PDATE 1
DATE+ 'PDATE' STO
MBASE MB\->I ROT STOF
      IF DUP2 <
      THEN DROP
      ELSE DROP NEG
      END
    \>>
  MFRAC
    \<<
      IFERR 'PDATE'
RCL
      THEN DROP
DATE TIME GETDATE
      ELSE DROP
      END RCLF
MBASE DUP MB\->I
'Illuminated' \->TAG
SWAP MB\->A 'Age'
\->TAG ROT STOF 'E'
PURGE
    \>>
  MFRST
    \<< PDATE DUP IP
SWAP 100 * FP 1 +
100 / + 'PDATE' STO
    \>>
  MGRAPH
    \<<
"Calculating month len"
1 DISP
"and initial lunar pos"
2 DISP
      IFERR 'PDATE'
RCL
      THEN DROP
DATE TIME GETDATE
      ELSE DROP
      END { (1,-.1)
} PDATE NXTMTH -1
DATE+ FP 100 * IP
1.1 R\->C 1 \->LIST + {
X } + \GDDAY 1 \->LIST
+ { (0,0) FUNCTION
Y } + 'PPAR' STO
'M.EQ' 'EQ' STO
ERASE 5 MDIR
      CASE DUP DUP
ABS .8 > SWAP 0 <
AND
        THEN 54
        END DUP DUP
ABS .2 < SWAP 0 <
AND
        THEN 5
        END DUP 0 <
        THEN 5
        END 54
      END SWAP DROP
PDATE DUP IP \->STR
"/" + SWAP 100 * FP
10000 *
      IF DUP 100 /
IP 19 ==
      THEN 100 / FP
100 *
      END \->STR +
LBL RCLF DRAW TCKS
STOF 'E' PURGE 7
FREEZE
    \>>
  MLINE
    \<< \-> SC LI L R
      \<< SC L * 64 +
R\->B LI R\->B 2 \->LIST
SC R * 64 + R\->B LI
R\->B 2 \->LIST LINE
      \>>
    \>>
  MPHASE
    \<< RCLF -31 SF
DEG ERASE { # 0d
# 0d } PVIEW {
# 64d # 28d } # 26d
0 360 ARC 26 28
MFRAC SWAP DROP
MPLOT PICT NEG 5 54
PDATE \->STR LBL 100
54 PTIME 4 FIX \->STR
LBL 7 FREEZE STOF
    \>>
  MPLOT
    \<< \-> RA MI F
      \<<
        IF F .5 <
        THEN F 360
* COS RA * RA
        ELSE RA NEG
F .5 - 360 * COS RA
*
        END \-> L R
        \<< 1 0
          FOR x x
ACOS SIN DUP MI x
RA * + L R MLINE MI
x RA * - L R MLINE
RA INV NEG
          STEP
        \>>
      \>>
    \>>
  MTIME
    \<< MFRAC \-> PCT X
      \<< X
29.53058868 * DUP
'X' STO IP "d " + X
FP 24 * IP + "h " +
X FP 1440 * 60 MOD
IP + "m (" + PCT
100 * 0 RND + "%)"
+
      \>>
    \>>
  NXTMTH
    \<< 1 +
      IF DUP IP 12
>
      THEN 12 -
.000001 +
      END DUP IP
SWAP 100 * FP 100 /
.01 + +
    \>>
  PDATE 3.311991
  PPAR { (1,-.1)
(31,1.1) X .5 (0,0)
FUNCTION Y }
  PTIME 0
  TCKS
    \<< { # 0d # 63d
} { # 130d # 63d }
LINE PPAR 2 GET
OBJ\-> DROP 1 SWAP
      FOR d d -.05
R\->C C\->PX OBJ\-> DROP
DROP # 62d 2 \->LIST
PIXON
      NEXT
    \>>
  \GDDAY .5
END
***END OF POSTING***