[comp.sys.handhelds] HP48: Infinate Base Calculator V1.1

Ian Matthew Smith <IMS103@psuvm.psu.edu> (05/18/91)

This is a new release of my previous program.
Infinate Base Calculator Version 1.1
Version 1.0 has a problem with numbers over a trillion.

Changes:    The conversion routines now use binary numbers, so
          the effective range is increased from 999999999999
          to 18446744073709551615.  HbXm5a3 and LygHa16AHYF
          in base-62. :-)
            Small change in how the [E] key in the custom menu.
          You can now easily convert between diffrent bases.
            Left-shift CONV in the custom menu will toggle
          the object in level one betwen a real number and a
          binary number

Example: Multiply the base-13 number 123A and the base-7 number 654.

   13 [E]             <-- Set the base to 13.
   "123A" [ENTER]
   7 [left-shift E]   <-- Convert the base-13 number to base-7
                          and make base-7 the current base.
   "654" MUL

You get the answer 10212444 in base-7.  CONV converts it into
a binary number, and Left-shift CONV will toggle the binary number
into a real, giving you 860472.  (In base-10 of course)

Quiz: What is #65479187251277d in base-62?

This directory contains the following:

BMTH  : This creates a custom menu to help with doing math in IB
        format.  Add, Sub, Mul, and Div are just replacements for
        the keys on the HP.  CONV will convert an integer or binary
        bumber to an IB string and back automaticly.  The 5th softkey
        [E] shows the base you are working in. Pressing it will take
        the number in level one and make it the current base. Left-
        shifting [E] works like the unshifted [E], but also converts
        the number in level two to the new base.  Change the "Add" to
        "+", "Sub" to "-", ect.. if you think it looks better)
->IB  : Convert an integer or binary number into an IB string.
IB->  : Convert an IB string into a binary number.
->IB2 : Take the first two items and run ->IB on them,
        leaving their order intact.
IB2-> : Take the first two items and run IB-> on them,
        leaving their order intact.
BBASE : The current base.
BSTR  : A string used in the conversion proccess.

-- Ian Smith <<ims103@psuvm.psu.edu>>

Directory BASE
Cksum - #714Dh
Bytes - 1029.5
------------ Cut here ---------------
%%HP: T(3)A(R)F(.);
DIR
  BMTH
    \<< { Add
      \<< IB2\-> + \->IB
      \>> } { Sub
      \<< IB2\-> - \->IB
      \>> } { Mul
      \<< IB2\-> * \->IB
      \>> } { Div
      \<< IB2\-> / \->IB
      \>> } "B="
BBASE + {
      \<< 'BBASE' STO
BMTH
      \>>
      \<< SWAP IB\->
SWAP 'BBASE' STO
\->IB BMTH
      \>> } 2 \->LIST {
CONV {
      \<< DUP
        IF TYPE 0
==
        THEN R\->B
        END DUP
        IF TYPE 10
==
        THEN \->IB
        ELSE IB\->
        END
      \>>
      \<< DUP
        IF TYPE 0
==
        THEN R\->B
        ELSE DUP
          IF TYPE
10 ==
          THEN B\->R
          END
        END
      \>> } } 6 \->LIST
TMENU
    \>>
  \->IB
    \<< DUP
      IF TYPE 0 ==
      THEN R\->B
      END DUP
      IF TYPE 10 ==
      THEN RCWS
SWAP "" SWAP 64
STWS
        WHILE DUP
B\->R
        REPEAT DUP
BBASE DUP2 / * - 1
+ BSTR SWAP B\->R DUP
SUB ROT + SWAP
BBASE /
        END DROP
SWAP STWS
      END
    \>>
  IB\->
    \<< DUP
      IF TYPE 2 ==
      THEN RCWS
SWAP 64 STWS # 0h
SWAP DUP SIZE 1 - 0
SWAP
        FOR j DUP
DUP SIZE j - DUP
SUB BSTR SWAP POS 1
- # 1h
          IF j 0 >
          THEN
BBASE 1 j
            START
DUP ROT * SWAP
            NEXT
DROP
          END * ROT
+ SWAP
        NEXT DROP
SWAP STWS
      END
    \>>
  \->IB2
    \<< \->IB SWAP \->IB
SWAP
    \>>
  IB2\->
    \<< IB\-> SWAP IB\->
SWAP
    \>>
  BBASE 62
  BSTR
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
END