HP48 FAQ - Last-modified: 12/12/1994

Archive-name: hp/hp48-faq/part1
Last-modified: 12/12/1994
Version: 3.01
Posting-Freqency: every 14 days or so


        *********************************************************
             HP 48 S/SX/G/GX  Frequently Asked Questions List
        *********************************************************
              PART 1 of 4: Common Questions: Sections I - III

       Currently Maintained by: Keith Maddock (madd0118@nova.gmi.edu)
                  Originally Compiled by: Darryl Okahata

    The purpose of this FAQ is to provide answers to commonly asked 
questions about the Hewlett Packard 48 family of scientific calculators.  
This list contains information which has not necessarily been verified, 
and is not guaranteed to be correct, or even reflecting reality. :-)  It 
has been compiled from various postings in comp.sys.handhelds and 
comp.sys.hp48 as well as other sources.  In particular, some parts were 
taken from older HP 48SX "FAQ lists". 

     For some questions, there may be different answers for each 
calculator (G/GX vs. S/SX).  In this case S/SX specific information is 
preceded by an SX: on the left margin of the first line of each S/SX 
specific paragraph.  G/GX information is denotated by a GX: in the same 
place.  If a paragraph has no notation, then it is valid for all 
versions. 

     You should be able to find the latest version of the FAQ at the 
following locations:

cbs.cis.com   :              /pub/hp48g/uploads/48faqxxx.zip    or
                             /pub/hp48g/documentation/48faqxxx.zip

ftp.stud.fh-heilbronn.de   : /pub/hp48/info/FAQ/48faqxxx.zip   or
  (caution: slow line!)      /pub/hp48/incoming/48faqxxx.zip

The FAQ is also available over the WWW in a hypertext form. The URL is: 
http://kahless.isca.uiowa.edu/hp/faq/faqindex.html
There are also links at this location to other HP48 WWW resources.

     Please send any comments or suggestions to:
     Keith Maddock        madd0118@nova.gmi.edu

       *********************************************************
                           Table of Contents:
       *********************************************************
                    Key: ! =new Q/A  + =revised answer 

Part 1:
I. Misc. Questions
    1.1 I'm a novice, and I have some questions.  Where should I start?
    1.2 What Usenet Newsgroups are there for the HP 48?
!   1.3 What are some good FTP sites for the HP48?
!   1.4 Are there any good WWW links for HP48 stuff?
    1.5 What are good places to buy HP48's and accessories?

II. Questions about ROM versions
    2.1 What does the SX/GX have that the S/G doesn't?
    2.2 What is the difference between the HP 48G/GX and the HP 48S/SX?
    2.3 How can I tell what ROM revision I have?
    2.4 What bugs exist in the various versions of the HP 48?
    2.5 What is new with the revision "J" ROM? (S/SX)
    2.6 What happened to ROM revisions "F", "G", "H", "I", "O", and "Q"?
    2.7 Can I upgrade my HP 48S/SX?
    2.8 Can I upgrade my buggy GX to the latest ROM revision?
    2.9 What's the latest ROM version?
    2.10 Why would I buy a S/SX rather than a G/GX?

III. Questions about the Operating System / Using the HP
    3.1 I typed 'RULES' on my G/GX and got a crossword puzzle! What does it 
        mean? (GX)
    3.2 Why does my HP 48 occasionally "freeze" for a moment?
    3.3 What do I do if my HP 48 locks up?
    3.4 My HP 48 seems to take longer to turn on and off.  What's going on?
    3.5 What are all the different ON-KEY combinations and what do they do?
    3.6 What are the different interactive self-tests?
    3.7 I can't account for some of the RAM in the HP 48!   and 
        When I clear my memory, I don't have 32K free!  Why? 
    3.8 What are the best methods for dealing with libraries?
    3.9 Why does (1/3)*3 equal 0.999999999999?
    3.10 Why does my HP say that 0^0=1?
    3.11 If I add two temperatures like 34 deg.F and 11 deg.F, I get 504.67
         deg.F.  Why don't I get 45 deg.F?
    3.12 How can I add my own units? What's the 1_? unit for?
    3.13 I want `pi' to be a numeric value, not a symbol.  What's happening?
    3.14 What are those little numbers near the top of my screen and how do I
         get rid of them?
    3.15 What tricks are there for manipulating matrices?
    3.16 Can I use my HP48 as a remote or phone dialer?
    3.17 I could speed up my HP-28S.  How can I speed up my HP 48?
    3.18 What is the hidden directory and how do I access it?
    3.19 How can I recall one object from a memory archive?

PART 2: 

IV. Questions about cards, data transfers, batteries, hardware
    4.1 Can I upgrade my S or G to more than 32K ram?
    4.2 How can I get/build a cable for my HP48?
    4.3 Why doesn't the I/R port work farther than a few inches?
    4.4 Can my HP48 talk to my HP100LX via Infrared?
    4.5 I downloaded a program to my HP, and when I ran it, it put a string 
        on the stack like "HPHP48-.......".  What's wrong? 
    4.6 Why does XRECV not work sometimes? (GX)
    4.7 What do the funny symbols \->, \GS+, etc., mean?
    4.8 What are the pinouts for the HP 48 serial connector?
    4.9 Is there any information on interfacing to the HP 48?
    4.10 How can I transfer programs/data from my HP-28S to my HP 48?
    4.11 Can I use rechargeable batteries with the HP 48?
    4.12 How can I tell, from within a program, if the battery is low?
    4.13 My RAM card was plugged into the calculator when I changed the RAM
         card battery, yet I lost all the information on the card.  What
         happened?
    4.14 Why do I get an "Invalid card data" error when I merge a RAM card?
    4.15 I've heard that other manufacturer's RAM cards will work with the
         HP 48.  Is this true?  Will it work?
    4.16 Why does the HP 48SX display flicker slightly?
    4.17 I broke the LCD screen is there an easy way to get another?

V. Questions about programs
    5.1 Where can I get programs and information for the HP 48SX?
    5.2 What are the Goodies Disks and where do I get them?
    5.3 How do I get access to the HP Calculator BBS?
    5.4 What are files that end with ".zip", ".Z" or ".z"?
    5.5 What is a "ship" file?
    5.6 What is \->ASC or ASC\->?
    5.7 How can I get \->ASC and \->ASC?
    5.8 What is the HYDE library, and how do I get rid of it?
    5.9 What is the Minehunt game, and how do I use it? 
      
VI. Questions about programing and advanced user functions
    6.1 I've heard the names "RPL", "Saturn", "STAR", "Voyager", "GL", etc..  
        What do they mean
    6.2 Is there a C compiler for the HP48?
    6.3 Why do SysRPL programs run faster than UserRPL programs?
    6.4 How do I know what library ID number to use for my program?
    6.5 What information is there on the internals of the HP 48?
    6.6 Are there any viruses for the HP48?
    6.7 How do I store fields of variable length string data in a compact,
        rapidly accessible manner that does not require the overhead of
        storing strings in lists?
    6.8 What is "Vectored Enter", and how do I use it?
    6.9 What is "WSLOG"?
    6.10 What are SYSEVALs?
    6.11 What are some useful SYSEVALs?
    6.12 What are LIBEVALs?
    6.13 What are some useful LIBEVALs?
    6.14 What is the format of a GROB object?



*********************************************************************

PART 3:    
    * Appendix A: ASC\-> and \->ASC functions:
    * Appendix B: Using non-HP RAM cards in your HP 48SX:
    * Appendix C: What's new in the HP 48G/GX
    * Appendix D: The EquationWriter Bug & Rev J Bugfix
    * Appendix E: Compact Data Storage:
    * Appendix F: Various useful functions
    * Appendix G: Rotation rate to angular frequency conversion bug
!   * Appendix H: How to make a Serial Cable for your HP48
               
PART 4:
+   * Appendix I: HP48 "BEST PROGRAMS AND WHERE TO GET THEM" LIST

******************************************************************

I. Misc. Questions

******************************************************************

1.1 I'm a novice, and I have some questions.  Where should I start?

   Start by perusing the HP 48 manuals.  You'd be amazed how many
   questions can be answered if you read the manuals.  
   
SX:Earlier HP 48S/SX manuals came in two volumes. The first volume 
   dealt with operating instructions, and the second volume dealt with 
   programming.  Later HP 48S/SX manuals combined these two volumes 
   into one. 
   
GX:HP 48G/GX models come with a one-volume owners manual that covers 
   all of the non-programming aspects of the calculator.  An Advanced 
   User's Reference (AUR) is available that covers programming aspects.  
   It is highly recommended.  They also come with a Quick Start Guide, 
   a guided tour of some of the HP48's capabilities.
   
   Also, look over the section "Answers to Common Questions", in 
   Appendix A of the manual. If you have a two-volume manual, it will be in 
   volume II.

******************************************************************

1.2 What Usenet Newsgroups are there for the HP 48?

        comp.sys.hp48           -- Primary newsgroup
        comp.sources.hp48       -- For HP 48 programs. (This newsgroup
                                   is moderated by Chris Spell -- send
                                   submissions to hp48@seq.uncwil.edu.)
                                   (this newsgroup has been dead for a 
                                   few months now )
        comp.sys.handhelds      -- Occasionally, HP 48 information is
                                   posted to this newsgroup.

******************************************************************

1.3 What are some good FTP sites for the HP48?

    Many HP48 programs can be found on the following FTP sites:  

    wuarchive.wustl.edu  :  /systems/hp/hp48
    cbs.cis.com          :  /pub/hp48g  
    hpcvbbs.cv.hp.com    :  /pub

    For a list of other HP48 FTP sites, see appendix 1 of 
    appendix I (HP48 Best Programs and Where to Get Them List)

******************************************************************

1.4 Are there any good WWW links for HP48 stuff?

    Rather than list out a long list of HP48 related WWW resources
    I am instead including a list of a few WWW pages around the net
    created by various people that include links to all sorts of
    WWW resources.  From these pages, you can access all the best
    of the HP48 related WWW resources.

    Jeffrey Thieleke
    http://kahless.isca.uiowa.edu/hewlett_packard.html 

    Jeffrey E. Sawdy
    http://www2.ncsu.eud/eos/users/j/jesawdy/mosaic/hp48.html

    Matthew Cravit
    http://www.interaccess.com/users/cravitma/Hp48_index.html
 
******************************************************************

1.5  What are good places to buy HP48's and accessories?

    Educalc:

    Educalc carries a complete line of HP calculators and accessories.  
    They also sell used HP48 S and SX's, and buy them as trade ins.
    To get a free catalog, call them.  
    Phone #'s:
    Toll Free Order:    (800) 677-7001  \___ Orders and Customer Service
    Toll Order:         (714) 582-2637  /    8-5, M-F, West Coast Time
    Credit Card Order:  (800) 535-9650 ext. 9162 (all hours, all days)
    FAX orders:         (714) 582-1445
    Technical Support   (714) 582-2637
    "Para ayuda en Espa¤ol - pregunte por Irma"

    Elek-Tek:

    Elek-Tek seems to only carry HP name brand products.  Their prices may 
    be slightly cheaper than EduCalc, but they don't carry non "HP brand" 
    products (such as RAM cards), that are much cheaper than HP brand ones.
    Toll Free: (800) 395-1000      Order: (708) 677-7660
    Fax: (708) 677-7168            Fax Orders: (708) 677-1081 

    Office Max: 
    Toll Free: (800) 788-8080
    
    Office Depot 

    Executive Photo and Electronics:
    120 West 31st St., New York, NY 10001-3485
    Tel: 800-223-7323 or 212-947-5295 Fax: 212-239-7157 
    Supposedly has different prices for 48 depending on country
     of manufacture....

    Calculators Inc., Minneapolis, MN (612) 866-8908

    Carrington, (800) 982-3731

    Global Connections Incorporated (formerly Connection Point, Inc.)
    50 South River Street,  Suite 105,  Janesville, WI 53545
    (608) 752-9548  (608) 752-1537
    
    Bristol, UK - Decimal Business Machines Ltd:
    "at Three Queens' Lane.  They're on 0272 294591/5."

******************************************************************

II. Questions about ROM versions

******************************************************************

2.1 What does the SX/GX have that the S/G doesn't?
    
SX: The HP 48S is the same as the HP 48SX except that the HP 48S does
    not have the two expansion slots of the HP 48SX.  This means that
    the HP 48S cannot be expanded and can only access 32K of memory,
    versus 288K for the HP 48SX (two 128K RAM cards).  (Actually, there
    are now third-party RAM cards that contain 256K or 512K on a single
    card -- this memory is accessed via a bank-switching mechanism.)

GX: The HP48G is the same as the GX except for two differences.  The GX has 
    the 2 expansion ports, and also has 128K RAM built in, where the G only 
    has 32K.
    
    If you plan on heavily using your calculator, you will probably find
    that 32K is not enough memory.

******************************************************************
    
2.2 What is the difference between the HP 48G/GX and the HP 48S/SX?

   The HP 48G and the HP 48GX calculators are, basically, slightly
   faster (by 40%) versions of the HP 48S and HP 48SX calculators, with
   more features, such as 3D-plotting and a new forms-based interface.
   Much of the HP Solve Equation Library card is now built-in.  See
   Appendix C for a detailed list of features.

   Note, however, that the HP 48G/GX is different from the HP 48S/SX in
   a number of significant areas:

     1. The HP 48GX comes with 128KB RAM, as opposed to 32KB RAM in the
        HP 48SX.  The HP 48G still has 32KB RAM, however.  The HP 48G/GX
        also has twice the ROM (512K), compared the HP 48S/SX (256K).
     2. Much of the HP 48G/GX internals have changed, compared with the
        HP 48S/SX.  Unfortunately, this means than many programs written
        in assembly language or System RPL won't work on the HP 48G/GX.
        This is especially true of any program that tried to access the
        display memory directly.
     3. The HP 48G/GX CPU runs at 4MHz, instead of the 2MHz used with
        the HP 48S/SX CPUs.  However, due to various overhead (memory
        bank switching, etc.), the speed increase between the G/GX and
        S/SX is less than 2X.  G/GX throughput is approximately 40% 
        faster.
     4. Port 2 of the HP 48G/GX can access up to 4MB, in 128K chunks
        (done via bank-switching).

******************************************************************

2.3 How can I tell what ROM revision I have?

GX:Type the command "VERSION".  Note that this command is not part of 
   any key or menu, and so you must spell it out. 

   Type #30794h SYSEVAL.  It returns a string, "HPHP48-x", where x is your 
   ROM revision. This works for both SX and GX.

SX:1. Turn the calculator on (press ON and then release).
   2. Press ON again, and hold it down.
   3. While holding down the ON key, press and hold down the "D" key (the
      fourth white key in the top row).
   4. While holding down the "D" key, release the ON key.
   5. Release the "D" key.  The display should be blank, with the
      exception of three vertical lines (one down the center, and one
      down each of the right and left sides).
   6. Press the backspace key (it says DROP and CLR over it).  A
      meaningless string of digits should appear in the top line of the
      display (mine says "705D9:1B8DA178E5A111B6" -- yours may be
      different).
   7. Press and hold down the EVAL key. It should say:
        Version HP48-*
        Copyright HP 1989
      where the * is an uppercase letter (A, B, etc.) indicating
      the ROM version.
   8. Release the EVAL key.  Hold down ON and hit "C" (the third
      white key in the top row.  This is a general reset
      operation that returns the calculator to normal from the
      diagnostic stuff (which is where ON-D puts you).

******************************************************************
   
2.4 What bugs exist in the various versions of the HP 48?

    Confirmed
    Version(s)  Bug
   ----------------------------------------------------------------------
      A         DEFINE rounds numbers in user-defined functions if STD
                is not the current display mode.

      A         KGET on a zero length file from another machine will
                cause the calculator memory to be cleared.

      A         NXEQ from the Graphics Environment with flag -3 set (SYM
                off in Modes) can overwrite the current equation with a
                number.

      A         Displaying the clock in 24-hour format causes the
                one-digits for minutes to be incorrect in the alarm
                catalog.

    A,B,C       INV returns an incorrect result if used on an 8x8 or
                larger matrix.  To get around this problem, divide the
                identity matrix with the matrix to invert.

   A,B,C,D      Entering a symbolic complex number in polar form like
                '(A,< RCLF -> f << -40 CF OFF f STOF >> >> 91.3 ASN
                   Turn on USER mode

   L,M          EquationWriter/Character Picker Bug: If the size of the 
                equation is greater than the regular size of the screen, 
                calling the Character Picker in Equation Writer will 
                garble the screen.
   
   M            EVALing a tagged object which contains an operator (+, -,  
                *, /, etc) as the second or subsequent character will 
                leave an External and System Binary on the stack, as 
                well as the original object.

   L,M,P        SigmaDAT: Put a NON-MATRIX in '\GSDAT' (SigmaDAT), run 
                STAT graphical apps, edit \GSDAT. Causes a crash. 
   
   L,M,P        XRECV: XRECV will fail or cause memory lost if the amount 
                of free RAM left is not about twice the size of the 
                expected file.  Fix: see FXREV on GD 9 by Joe Horn.

   L,M,P        RREF does not transform the matrix into Row Reduced Echelon 
                Form correctly if the first column of the matrix consists
                entirely of zeros.

   L,M,P,R      portnum: { dir ... var } RCL/EVAL fails if portnum >= 2

           
   L,M,P,R      Rotation rate to angular frequency conversion bug
                See Appendix G for complete write-up.

   M            Fixes a variety of other bugs, and includes a new display 
                with better contrast.

   M,P,R        Repeated executions of FFT or IFFT can cause memory loss 
                The FFT and IFFT warmstart problem is caused by a CPU 
                return stack overflow during interrupt handling.  The 
                problem can only occur when the argument to FFT or IFFT 
                is an MxN matrix with both M > 1 and N > 1.  The vector 
                argument case is immune to this problem. 
              
                FIX: To compute the FFT of a matrix without risking 
                warmstart, expand the matrix into its row vectors using 
                ->ROW, compute the FFT of each row vector, collect the 
                results into a matrix using ROW->, expand the matrix into 
                its column vectors using ->COL, compute the FFT of each 
                column vector, and finally collect the results into a 
                matrix using COL->.  Except for less precision, this is 
                the same result as would be obtained by applying FFT on 
                the original matrix.  Use the same procedure with FFT 
                replaced by IFFT to compute the IFFT of a matrix. 

                Here are program examples implementing the "matrix FFT" 
                and "matrix IFFT": 
                MFFT     << ->ROW FFTLP ROW-> ->COL FFTLP COL-> >>
                MIFFT    << ->ROW IFFTLP ROW-> ->COL IFFTLP COL-> >>
                FFTLP    << -> n << 1 n START n ROLL FFT NEXT n >> >>
                IFFTLP   << -> n << 1 n START n ROLL IFFT NEXT n >> >>

   M,P          BESTFIT: Occurs when a two dimensional array is stored in 
                '\GSDAT' (SigmaDAT).  Pressing the BESTFIT softkey 
                multiple times quickly can cause a warmstart, or SigmaDAT 
                to be erased. This occurs sometimes just by pressing 
                BESTFIT repeatedly, regardless of /GSDAT content.  This bug 
                can also be triggered by pressing the BESTFIT softkey quickly 
                after pressing any other key.  Simply pressing MODL then 
                BESTKEY quickly will trigger the bug.
   
   M,P,R        Eqwr/Eqlib interaction bug: If you pick an equation from 
                the EQ library, enter solver for that equation, enter an 
                algebraic on the stack like 'X^2', and press the down 
                arrow key to view algebraic in EquationWriter, the name 
                of the equation will appear in the EquationWriter along 
                with the unassociated algebraic. 
                
   P            PROOT: If you put a matrix of coefficients on the stack 
                and press PROOT repeatedly, you will get a warmstart
   
   A-R          MatrixWriter Bug: This shows up when deactivating and
 		reactivating any of the two direction movement fields. 
		If you do this, the active matrix field won't move as 
		it's supposed to.  For example: Launch the matrix writer 
		(check that your GOFORWARD field is activated). Enter [1]
		[ENTER]. The active matrix field moves forward as it should.
		Deactivate the GOFORWARD field and activate it again. Now 
		enter [2] [ENTER] [3] [ENTER]. The digits should show up on 
		the same row, but they don't, 'cause after you deactivated 
		and reactivated the GOFORWARD field, the active matrix field
		stops moving according to the movement fields.
 

             
    
******************************************************************
   
2.5 What is new with the revision "J" ROM? (S/SX)

   The revision J ROM has a faster equation writer, as well as some bug
   fixes.  Scrolling of graphics is also faster.

   One "problem" is that the revision J ROM changed some undocumented
   ROM entry points, which broke those programs that used them.  If you
   have a Rev J ROM, you will not be able to run some old programs.

******************************************************************

2.6 What happened to ROM revisions "F", "G", "H", "I", "O", and "Q"?

   These versions either were never released to the public, or were
   skipped over.

******************************************************************
           
2.7 Can I upgrade my HP 48S/SX?

    When the G/GX first came out, HP had a trade in program.  This is no 
    longer in operation.  You can either try to sell you S/SX privately, 
    or you can trade it in at EduCalc.  They will give you $50 credit 
    for a S, and $95 credit for an SX.  You have up to 45 days after you 
    purchase your G/GX from them to send in you S/SX. 

******************************************************************

2.8 Can I upgrade my buggy GX to the latest ROM revision?
 
As far as I know, not any more.  They had a program a in early '94, but
it is over now.  Contact the following for more info:
   
                Hewlett-Packard Corporation
                Calculator Support
                1000 NE Circle Blvd
                Corvallis, OR 97330
        
                Phone (503) 757-2004 option 1

******************************************************************

2.9 What's the latest ROM version?

    Revision R is the latest ROM version of the G/GX series.
    Revision J is the last ROM version of the S/SX series.

******************************************************************

2.10 Why would I buy a S/SX rather than a G/GX?

     Here's the Top 12 reasons to buy a S/SX instead of a G/GX:
     (thanks to all who contributed)

     1)  May be slightly cheaper, having only 32k ram.

     2)  It isn't THAT outdated.

     3)  You can run neat emulators like x48

     4)  So what if it's a little slower?

     5)  You didn't need all those useless equations, graphics
         capabilities, and math and science functions anyways!

     6)  If you break it, you're out less money!

     7)  You like seeing how much you can fit into 32k ram.

     8)  You like slow file transfers, using Kermit instead of Xmodem.

     9)  You want to be able to use all those lists of SYSEVALs for the SX.

     10) You like having only 3 ports available max.  33 is ridiculous!

     11) Since it doesn't have a built in equations library it is less
         likely to be banned on tests. 

     12) Only wimps need GUI's, dialog boxes, and choose lists.

******************************************************************

III.  Questions about the Operating System / Using the HP
            
******************************************************************

3.1 I typed 'RULES' on my G/GX and got a crossword puzzle! What does it 
    mean? (GX)

    [From Joe Horn:]

    Many commercial programs (like Windows) have similar hidden screens 
    that list the program's design team.  Since they are always so cute 
    and well hidden, they are often referred to as "Easter eggs".  The 
    RULES command on the G/GX is one such example.

    Try using the RULES command.  The names you see are as follows:

     /----------------------\
     |            M G       |
     |      P   DIANA       |
     |    CHARLIE X B     D |
     | BILL U   N  TED    A |
     | O  A L   N    ALCUIN |
     | B  I    JIM   V      |
     |  RON     S    E      |
     \----------------------/

     ALCUIN was the HP-internal code name of the HP 48G during
     development, because Alcuin was Charlemagne's teacher, and
     Charlemagne, as you remember, was the code name of the 48SX.

     The other names in the "Easter egg" above belong to:

     BILL Wickes (list processing; "Father of RPL")
     CHARLIE Patton (RPL operating system)
     TED Beers (parameterized outer loop; interactive stack; key handling
          system; high-level display management; input forms)
     DIANA Byrne (project manager; plotting; graphics)
     GABE Eisenstein (EquationWriter)
     BOB Worsley (I/O)
     PAUL McClellan (unit management; math)
     CLAIN Anderson (product manager; marketing)
     DENNIS York (manager)
     JIM Donnelly (EQ LIB; list processing; variable tic logic; developer
             support)
     MAX Jones (menu system; editing)
     DAVE Arnett (hardware)
     DAN Coffin (manuals)
     RON Brooks (marketing)
    
     
******************************************************************

3.2 Why does my HP 48 occasionally "freeze" for a moment?

    The HP 48 must occasionally do "garbage collection" to free up
    unused memory, and it is this garbage collection that is causing the
    momentary "freeze".  "Garbage collection" is where the HP 48 scans
    through memory, looking for objects that are no longer used.

    Using less stack supposedly makes garbage collection go faster.

    To force a garbage collection, you can use the syseval #05F42h or
    the SysRPL command GARBAGE.  (see q/a # 6.10 for syseval info)

******************************************************************

3.3 What do I do if my HP 48 locks up?

    NOTE: If you have it, read the sections in the GX manual starting
    on page 5-16, "Special Memory Operations", and "Testing Calculator
    Operation" on page A-9. 
    NOTE: under most circumstances, your calculator should never lock 
    up.  Some earlier versions of the G/GX do this due to bugs.  Of 
    course, depending on the program being run, it may appear to lock 
    up, but pressing the "ON" key usually interrupts whatever the 
    calculator is doing.  If it does lock up, this is usually caused by 
    a buggy assembly-language or system RPL program, and, chances are, 
    the memory contents of your HP 48 are gone (as in "destroyed", 
    "terminated", "wiped out", "deleted", etc.). 

    First, check the batteries to make sure that they are installed 
    correctly.

    Next, try is pressing the "ON" key again and again very RAPIDLY.
    The operative word here is "rapidly".  It's possible to write a
    program that can only be interrupted during a very narrow window,
    and so you must press the "OK" key again and again very rapidly to
    interrupt the program.  If the calculator doesn't respond within ten
    or so seconds, go on to the next step.

    Press "ON-+" a couple of times, just in case the LCD display
    intensity was turned down.  Here, "ON-+" means:

     1. Press and HOLD DOWN the "ON" key.
     2. Press and release the "+" key, WHILE HOLDING DOWN THE "ON" KEY.
     3. Release the "ON" key.

    If this doesn't work, the next thing to try is ON-C.  This is a 
    "warm-start" or "system halt".   Note that this will CLEAR the
    stack.  Here, "ON-C" means: 

     1. Press and HOLD DOWN the "ON" key.
     2. Press and release the "C" key, WHILE HOLDING DOWN THE "ON" KEY.
     3. Release the "ON" key.

    If this does not work, it is possible that the HP is not responding
    because it is not accepting input from the keyboard.  It is possible
    to execute a system halt without the keyboard using the hidden
    reset button.

    The reset button is hidden under one of the two upper rubber feet on
    the bottom of the calculator (it's under one of the two feet near
    the serial connector and I/R port).  Note that the location of the
    reset button (under which foot) varies from calculator to
    calculator.  If you gently pull out the rubber feet, you'll notice
    that there is a small hole under each foot.  The reset button is
    located in the hole that has an "R" next to it.  Once you've located
    the correct hole, you press the button by GENTLY sticking an unbent 
    paper clip, into the hole with the "R" next to it.  Hold for one 
    second and remove.

    The next thing to try is a complete memory reset.  Depending on the
    state of your calculator, this may or may not preserve the contents
    of memory.  At the very least, even if the contents are preserved,
    the contents of the HOME directory will probably be moved into a new
    directory below HOME (HOME will be empty with the exception of this
    new directory); you'll have to manually move the items back into
    HOME.

    To perform a complete memory reset, press ON-A-F.  This means:

     1. Press and HOLD DOWN the "ON" key.
     2. Press and HOLD DOWN THE "A" key, WHILE HOLDING DOWN THE "ON" KEY.
     3. Press and HOLD DOWN THE "F" key, WHILE HOLDING DOWN THE "ON" AND
        "A" KEYS.
     4. Release all of the keys.
     5. At this point, the calculator will ask you if you want to
        recover memory.  Answer "yes" to this question.  Note that this
        can take a long time.  If you answer "no", all of memory will be
        cleared (the old contents will be lost).

******************************************************************

3.4 My HP 48 seems to take longer to turn on and off.  What's going on?

    The usual causes for this are RAM/ROM cards and libraries.  When you
    turn the calculator on, it checks RAM (the more you have, the longer
    it takes), and checks to see if any libraries need initializing.

    Also, having a lot of alarms can supposedly also cause this.

*****************************************************************

3.5 What are all the different ON-KEY combinations and what do they do?
    [Note: this answer written by a member of the HP48 team in Corvallis]
    --begin quote-- (formatted for this document)
    [ON]  In most cases, this will move you to, or toward, the stack 
          environment. 
    
    [ON]+A+F  This is the manual Coldstart.  It will break out of 
              _almost_ any hung program, and offer you the dreaded 
              option... Try to recover memory? Note that this is your 
              next-to-last resort in a lock-up, so don't give your 
              machine this three-fingered salute unless you really want 
              to possibly clear memory. 

    [ON]+B  This is the Oops! key for [ON] codes.  For many [ON] 
            sequences, this cancels the operation, so long as you press 
            the B before releasing the [ON] key. Try it sometime, if you 
            must, just so you remember it.  It can be a life-saver, in 
            case of an accidental [ON]+A+F in process, or even 
            accidentally hitting [ON] during a plotting routine. 

    [ON]+C  This will initiate a Warmstart.  You'll lose the stack, but 
            it will often get you out of a locked up program with memory 
            intact. 

    [ON]+D  Enters interactive test mode.  I won't even atempt to catalog 
            the various tests and odd jobs available from here.  Back up 
            your own machine and play around.  Exit this test mode with 
            Warmstart, [ON]+C.   [Note: See 3.6 for a list of the 
            interactive tests]

    [ON]+E  Starts a looping self-test mode.  Kinda dull after the first 
            five minutes, but it keeps a rather solid tempo.  Exit with 
            Warmstart, [ON]+C. 

    [ON]+4  Cancels repeating alarms.  

    [ON]+1  Screen dump utility.  

    [ON]+[+], [ON]+[-]  Adjusts display contrast.

    [ON]+[SPC]  Initiates Coma Mode and clears Warm Start Log.  In Coma 
                mode, all the clocked activity is halted.  The battery 
                power drain as basically the few nanoamperes necessary to 
                sustain your RAM contents.  The Warm Start Log is a 
                nearly bullet-proof area of memory which keeps track of 
                the last four hazardous events.  View it using the 
                command, WSLOG.  This log is one of the few things not 
                cleared by a Coldstart.  But it is cleared by [ON]+[SPC]. 
                Enter Coma this way if you want to clear the Warm Start 
                Log, if you are planning to study crystal healing in 
                Tibet for a few years and want to keep your pirated 
                version of Tetris alive, or you just have a low power 
                fetish. Exit Coma mode with the [ON] key (tough to 
                remember, huh?), and plan to find your stack cleared out. 

    Two additional notes on this Coma stuff.  First, I'm not gonna try to 
    list the log codes in WSLOG.  Sorry!  Second, if your machine is on, 
    and you drop the batteries out, you will _usually_ end up in a coma 
    mode to preserve power. WSLOG will not be cleared.  Instead, you will 
    find a code 1 entry there.  Some people are paranoid and want to be 
    in Coma when they change batteries, just in case they have a sudden 
    emergency call from the Prime Minister and don't get back to their 
    battery change for a half hour.  If you are one of these...  shall I 
    say, weenies?  No, that would be unprofessional ...users, then I 
    recommend you use the [ON]+[SPC] entry route, rather than the 
    kamikaze method of dropping batteries with the machine running.  
    Myself, I just turn the machine OFF, like the manual says. 
    
    Now, a Coma story... sort of.  During the G/GX development, I 
    maintained a small number of units on which I changed ROM chips as 
    incremental code releases came out.  This was so folks like Bill 
    Wickes and Jim Donnelly could have fully-real hardware to test, 
    instead of just the EPROM handsets some of you may have seen.  We 
    always backed up anything of importance in the machine before we did 
    this.  But I got into the habit of using [ON]+[SPC] before I opened 
    up the calculator.  Better than half of the time, I could remove the 
    batteries, open the case, desolder the old surface-mounted ROM chip, 
    solder down a new chip, and reassemble the machine... with all of RAM 
    intact!  When I pressed [ON], I'd come right back up with no Try to 
    Recover Memory? prompt. Pretty good, huh?  The folks who put that 
    mode into the machine certainly weren't in a coma. 
    --(end quote)--

******************************************************************

3.6 What are the different interactive self-tests?

    Pressing ON-D enters the interactive self test function of the HP48.  
    When you first press ON-D, you will see 3 vertical lines, one on each 
    side of the screen and one in the middle.  The tests are as follows:
    Press ON-C to exit.

    [A]   Displays CPU speed
    [B]   LCD test.  Press Enter to cycle through the tests
    [C]   Internal ROM test
    [D]   Internal RAM test
    [E]   Keyboard test.  Starting with [A], press all the keys in order, 
          left to right, top to bottom.  If all goes well, it will say 
          KBD1 OK
    [F]   Partial Keyboard test
    [G]   ESD test monitor.  Battery status is shown by bars.
    [H]   UART loop-back test
    [I]   Wired UART echo
    [J]   Shows whats plugged in. Press any key a few times
    [K]   Test RAM cards in ports
    [L]   Blanks display
    [M]   Sends system time from IR port
    [N]   Receives system time from IR port (have another HP send it)
    [O]   IR loop-back test
    [P]   IR UART echo
    [S]   Shows test start time
    [T]   Shows test fail time
    [U] [V] [W] [X] [Y] [Z]   Looping test
    [ENTER]   Initialize test tims
    [DEL]   Test summary
    [<-]   (backspace) Enters memory scanner (SX)

******************************************************************

3.7 I can't account for some of the RAM in the HP 48!   and 
    When I clear my memory, I don't have 32K free!  Why? 
    
    The HP48 S/SX/G have 32K base memory, and the GX has 128K.  However 
    not all this memory is available to the user.  The operating systems 
    uses memory for system variables, flags, fonts, last stacks, last 
    arguments, last menus, and such.  It also can be any one of a number 
    of things: 
    
    1). Enabling the use of LAST STACK, LAST ARG, LAST CMD, etc., uses 
    up extra RAM, as the calculator has to keep track of the last 
    stack, arguments, command, etc..  This is particularly important 
    with LAST STACK if you have a large/complex stack, as the HP 48SX 
    has to keep enough information around to recreate the stack after 
    each operation.  You can clear out these variables by pressing ON-C 
    (but also note that this will clear out the stack, the graphics 
    PICT, etc.). 
    
    2.) From William Wickes, a member of the HP 48 development team:
    Here's a candidate for "most obscure way to use up memory on the HP 48SX."
    When a program executes DOERR with a string argument, the string and hence
    the program too if the string is embedded in the program are referenced
    for the sake of the ERRM command.  Thus if you purge the program, the
    memory used by the program is not reclaimed until the ERRM reference is
    updated to a new string.  If the string is in a port, you will get
    the Object In Use error if you try to purge the library or backup object
    containing the string.
    A system halt prior to a PURGE will not help unless the object is in
    port 1 or port 2 (it will reclaim memory held by a successfully purged
    but still referenced object).  For port 0 objects, the only way to
    break the reference is to execute DOERR again with a new string.
    
    3.) Occasionally, I have had problems with libraries disappearing, but 
    still taking up memory.  I found that an "ON-A-F" reset will cause these 
    libraries to re-appear. If you still cannot account for a large chunk of 
    memory, I would suggest a hardware reset, after backing up your memory.
    
******************************************************************

3.8 What are the best methods for dealing with libraries?

    To install a Library:
    1. Download it into a variable of the calc.
    2. Place the library on the stack.
    3. Type the number of the port in which you want to store the
       library in.  0 is appropriate if you do not have any expansion 
       cards. 
    4. Press STO to store the library in that port. 
    5. Turn the calculator off and then on, or press ON-C, to finish 
       installation of the library.

    NOTE: sometimes you have to purge the variable containing the library 
      before storing it in a port, if you are low on memory.  As well, if 
      you have FXRECV installed. Just type a port number, hit FXRECV and 
      the library will automatically go into the specified port. All you 
      have to do then in turn the calc off and then on to complete 
      installation. 

    To delete a Library:
    
    Say you have library 1234 in port 0 than you want to delete.
    
    1.  Goto directory that the library is attached.  Usually HOME.
    2.  Enter :0: 1234
    3.  Press ENTER or type DUP
    4.  Type "DETACH"
    5.  Type "PURGE"
    
******************************************************************

3.9 Why does (1/3)*3 equal 0.999999999999?

    This is due to the way numbers are typically represented by
    computers and calculators.  There are infinitely many numbers, like
    `1/3' and `pi', that cannot be exactly represented internally (their
    decimal representations go on forever, and oftentimes cannot even be
    represented as a fraction, as in the example of `pi').  As a result,
    any calculations that use these numbers are bound to be off.

******************************************************************

3.10 Why does my HP say that 0^0=1?

    Some claim that 0^0 is defined as 1, some claim it is indeterminate.  
    The HP mathematicians decided to use the definition.  Here is some 
    more concrete info shamelessly lifted from the Sci.Math-FAQ:

Q:  What is 0^0 ?

A:  According to some Calculus textbooks, 0^0 is an "indeterminate
    form". When evaluating a limit of the form 0^0, then you need
    to know that limits of that form are called "indeterminate forms",
    and that you need to use a special technique such as L'Hopital's
    rule to evaluate them. Otherwise, 0^0=1 seems to be the most
    useful choice for 0^0. This convention allows us to extend
    definitions in different areas of mathematics that otherwise would
    require treating 0 as a special case. Notice that 0^0 is a
    discontinuity of the function x^y.

    Rotando & Korn show that if f and g are real functions that vanish
    at the origin and are _analytic_ at 0 (infinitely differentiable is
    not sufficient), then f(x)^g(x) approaches 1 as x approaches 0 from
    the right.

    From Concrete Mathematics p.162 (R. Graham, D. Knuth, O. Patashnik):

    "Some textbooks leave the quantity 0^0 undefined, because the
    functions x^0 and 0^x have different limiting values when x
    decreases to 0. But this is a mistake. We must define

       x^0 = 1 for all x,

    if the binomial theorem is to be valid when x=0, y=0, and/or x=-y.
    The theorem is too important to be arbitrarily restricted! By
    contrast, the function 0^x is quite unimportant."
    Published by Addison-Wesley, 2nd printing Dec, 1988.

    References:

    H. E. Vaughan, The expression '0^0', Mathematics Teacher 63 (1970),
    pp.111-112.

    Louis M. Rotando & Henry Korn, "The Indeterminate Form 0^0",
    Mathematics Magazine, Vol. 50, No. 1 (January 1977), pp. 41-42.

    L. J. Paige, A note on indeterminate forms, American Mathematical
    Monthly, 61 (1954), 189-190; reprinted in the Mathematical
    Association of America's 1969 volume, Selected Papers on Calculus,
    pp. 210-211.
       
******************************************************************

3.11 If I add two temperatures like 34 deg.F and 11 deg.F, I get 504.67
    deg.F.  Why don't I get 45 deg.F?

    This occurs with the S/SX only.  This behavior changed in the 
    G/GX.  With the G/GX, adding 34 deg.F and 11 deg.F will give 45 
    deg.F using TINC and TDELTA.  However, the G/GX will only add or 
    subtract temperatures if the units are the same; it is now an error 
    if they are not. 

    If the units attached to the number consists only of a temperature and
    nothing else, operations are done using an absolute temperature scale
    (relative to absolute zero).  If the units consists of a temperature
    and something else, such as degrees/minute, the operation will not be
    done using an absolute temperature scale.

    It also does not make any physical sense to add two temperatures.  You
    can't add a cup of water at 20 degrees C to a cup of water at 30
    degrees C and end up with two cups of water at 50 degrees C.

******************************************************************

3.12 How can I add my own units? What's the 1_? unit for?
     
    [Note: Some later editions of the G/GX series manuals have some
     similar information on this subjet on pages 10-14 and 25-15.]

    Another feature is the generic unit, 1_?. It seems to be intended 
    as a generic unit, to allow you to make new units not based 
    upon any of the built-in ones. You could use it to create a 
    conversion utility for currencies or bits and bytes. [Before you 
    create either, check the FTP sites to see what others have done in 
    this regard.] 
    
    Here's an example. Convert this using ASC\-> and save it as 'sample'. 
    
"69A20FF78E000000005046F6E6574750ADA209C2A2C2A2070000F368B01B2130
E20005046F6A756E650ADA20339201000000000000210C2A20F000046F6E6574
768B01B2130640005086F6D6562750ADA20339200000000000000510C2A20F00
0046F6E65747C2A20B0000D696E686B0168B01B2130B5000303435453047A204
7A20C2A20F000046F6E65747ADA209C2A2C2A20F000046F6E6574768B01B2130
B213047A20C2A20F000046F6A756E6ADA209C2A2C2A20F000046F6A756E668B0
1B2130B213047A20C2A20F000086F6D65627ADA209C2A2C2A20F000086F6D656
2768B01B2130B2130B2130F0DA"

    This is a sample directory with a custom menu. Enter the directory 
    and press the CST key. Here you will see three units (truncated to 
    fit the softkeys): donut, dozen, and homer. A dozen is defined as 
    12_donut, and a homer is a rate of 1.5_donut/min (not part of the SI 
    system). These units may take SI prefixes described on page 10-5 of 
    the User's Guide, so you may convert the value of 3_MW*h/kdonut into 
    units of erg/mdozen using CONVERT, for example. The items in the CST 
    menu have the usual abilities of unit menu objects as described on 
    pages 10-2 and 10-3 of the User's Guide. These units can be used for 
    math operations described on page 10-7 of the User's Guide, such as 
    adding 2_donut to 1_dozen. 

    Example: At your power plant, you have four control room operators 
    who have a combined consumption rate of 2.28 homers. How many donuts 
    will they use in 5 minutes and 17 seconds? 
    
    Step 1: Enter the rate.
       2.28 [homer]
    
    Step 2: Enter the time.
       right-shift UNITS [TIME]
       5 [min]
       17 [s] +
    
    Step 3: Multiply the time by the rate.
       x
    
    Step 4: Convert to dozens.
       CST left-shift [dozen]
    
    And the answer is a little over 1.5 dozen.
    
    [If you know more about 1_? and what it can do, please let the FAQ 
    maintainer know!] 

******************************************************************

3.13 I want `pi' to be a numeric value, not a symbol.  What's happening?

    You are using "Numeric Constants Mode".  To turn this mode on or off:
    
SX: Type  "-2", then "SF" (w/o the quotes).  This turns the numeric constants
    mode on.  To turn it off, type   "-2"  "CF". (again, no quotes)

GX: Go to the MODES menu (press green/right-shift MODES). Hit the key for
    FLAG submenu.  Toggle the 02 flag, "Contant -> symb", to turn on and
    off.

******************************************************************

3.14 What are those little numbers near the top of my screen and how do I
    get rid of them?

    The little numbers are "user flags".  When you or a program sets any
    of the user flags 1 through 5, little numbers corresponding to the
    set flags are displayed at the top of the screen.

    The HP uses negative flags for setting various modes and functions,
    while positive flags were reserved for the use of the user.  To set a
    user flag type the number, then SF.  To clear a user flag type the
    number, then CF.

******************************************************************

3.15 What tricks are there for manipulating matrices?


SX: You can build up a matrix by rows using \GS+
    You can take a matrix apart by rows using \GS-
    These two commands (\GS is Sigma (Greek E)) add and subtract rows 
    from the SigmaDAT Statistics matrix.  \GS+ takes a vector row and 
    adds it to SigmaDAT, and \GS- takes the bottom row away from 
    SigmaDAT. \GS+ is accessible from the STAT menu with its own 
    softkey.  \GS- can be obtained by pressing left/shift /GS+, or by 
    typing it in at the command line.
    
GX: The GX has many matrix functions built in.  See Appendix C.

******************************************************************

3.16 Can I use my HP48 as a remote or phone dialer?

    There are numerous programs available for remote control.  See 
    Appendix I for recommendations.

    To make phone dialing tones, you need to produce two simultaneous 
    tones.  The speaker in the HP48 is not good enough to support the DTMF 
    (dual tone multi frequency) tones that are used to dial. (They're a 
    combination of two tones at the same time.) 
    
******************************************************************

3.17 I could speed up my HP-28S.  How can I speed up my HP 48?

    You can't, really.  Unlike the HP-28S, the clock speed in the HP
    48SX is hardwired to 2 MHz, and to 4MHz in the 48GX.

    However, in some cases, you can speed up the HP 48 by turning off
    the display refresh, which supposedly takes up about 11% of the CPU
    time.  Detlef Mueller  submitted a program to
    comp.sources.hp48 that turns off the display refresh.  Look in the
    various HP 48 archives for a copy.

******************************************************************

3.18 What is the hidden directory and how do I access it?

    The "hidden directory" is a subdirectory of the HOME directory.
    It is created on startup, and it contains variables with your
    alarms and user key configurations.    You can use the hidden
    directory to store whatever you want, however you CAN NOT ORDER
    the contents of this directory, as this causes memory loss.

    The name of the hidden directory is a null character, ''  .
    The only way to get a null character is to use a syseval.
    You can use the following program to access the hidden
    directory:                               Comments:
    <<  HOME                            (changes to home dir)
        #15777h               (syseval to get null character)
        SYSEVAL                         (returns '' to stack)                
        EVAL >>                       (changes to hidden dir)

    To exit the hidden directory, use HOME or UPDIR.  This will
    return you to the HOME directory.       
     
    Also, by putting the null character as a part of your HOME
    custom directory, you can switch right into the directory
    by pressing the softkey.  
    Note: The SysRPL command NULLID returns a null character to
          the stack; it is the sames as #15777h SYSEVAL.

******************************************************************

3.19 How can I recall one object from a memory archive?

    [Joe Horn] 

    There is a little-known method of recalling objects from within
    archives.  Just make a list representing the PATH to the object, and
    tag the *list* with the port number.  Then hit RCL or EVAL.
 
    For example, if your archive in port 1 is called BKUP, and it 
    contains a directory called GAMES which contains a program 
    called REVERSI, you can run the game directly (without having 
    a separate copy of REVERSI stored anywhere!) by:

                   :1: { BKUP GAMES REVERSI } EVAL

    Or, you can RCL instead of EVAL, and it'll be pushed onto the stack.

    NOTE WELL: This method only works in ports 0 and 1 in a GX.  It works
    on any port in the SX.

    ANOTHER NOTE: This method works with directory objects stored as
    backup objects, as well as with the results of the ARCHIVE command,
    because they are both really the same thing.

******************************************************************



END PART 1 OF 4

Archive-name: hp/hp48-faq/part2
Last-modified: 12/12/1994
Version: 3.01
Posting-Freqency: every 14 days or so

        *********************************************************
             HP 48 S/SX/G/GX  Frequently Asked Questions List
        *********************************************************
    PART 2 of 4: Hardware, Programs, and Programming: Sections IV - VI
                           
       Currently Maintained by: Keith Maddock (madd0118@nova.gmi.edu)
                  Originally Compiled by: Darryl Okahata

Key: ! =new Q/A  + =revised answer 

PART 2:    

IV. Questions about cards, data transfers, batteries, hardware
!   4.1 Can I upgrade my S or G to more than 32K ram?
!   4.2 How can I get/build a cable for my HP48?
    4.3 Why doesn't the I/R port work farther than a few inches?
    4.4 Can my HP48 talk to my HP100LX via Infrared?
    4.5 I downloaded a program to my HP, and when I ran it, it put a string 
        on the stack like "HPHP48-.......".  What's wrong? 
    4.6 Why does XRECV not work sometimes? (GX)
    4.7 What do the funny symbols \->, \GS+, etc., mean?
    4.8 What are the pinouts for the HP 48 serial connector?
    4.9 Is there any information on interfacing to the HP 48?
    4.10 How can I transfer programs/data from my HP-28S to my HP 48?
    4.11 Can I use rechargeable batteries with the HP 48?
    4.12 How can I tell, from within a program, if the battery is low?
    4.13 My RAM card was plugged into the calculator when I changed the RAM
         card battery, yet I lost all the information on the card.  What
         happened?
    4.14 Why do I get an "Invalid card data" error when I merge a RAM card?
    4.15 I've heard that other manufacturer's RAM cards will work with the
         HP 48.  Is this true?  Will it work?
    4.16 Why does the HP 48SX display flicker slightly?
    4.17 I broke the LCD screen is there an easy way to get another?


V. Questions about programs
    5.1 Where can I get programs and information for the HP 48SX?
    5.2 What are the Goodies Disks and where do I get them?
    5.3 How do I get access to the HP Calculator BBS?
    5.4 What are files that end with ".zip", ".Z" or ".z"?
    5.5 What is a "ship" file?
    5.6 What is \->ASC or ASC\-> and where can I get it?
    5.7 What is the HYDE library, and how do I get rid of it?
    5.8 What is the Minehunt game, and how do I use it? 

VI. Questions about programing and advanced user functions
    6.1 I've heard the names "RPL", "Saturn", "STAR", "Voyager", "GL", etc..  
        What do they mean
!   6.2 Is there a C compiler for the HP48?
    6.3 Why do SysRPL programs run faster than UserRPL programs?
    6.4 How do I know what library ID number to use for my program?
    6.5 What information is there on the internals of the HP 48?
    6.6 Are there any viruses for the HP48?
    6.7 How do I store fields of variable length string data in a compact,
        rapidly accessible manner that does not require the overhead of
        storing strings in lists?
    6.8 What is "Vectored Enter", and how do I use it?
    6.9 What is "WSLOG"?
    6.10 What are SYSEVALs?
+   6.11 What are some useful SYSEVALs?
    6.12 What are LIBEVALs?
    6.13 What are some useful LIBEVALs?
    6.14 What is the format of a GROB object?



 
******************************************************************

IV.  Questions about cards, data transfers, batteries, hardware

******************************************************************

4.1 Can I upgrade my S or G to more than 32K ram?

    It is possible to do this by opening up the case and adding
    some memory chips.  There is a zipfile containing instructions
    and schematics available for FTP:

    cbs.cis.com: /pub/hp48g/uploads/48gs256k.zip

    WARNING:  It is possible to ruin your HP in the process of
    performing this upgrade.  Do not attempt it unless you are
    adept at working with small electonics.  The FAQ maintainer and
    the authors of the instructions take no responisibility for
    anything you do to your HP... 

******************************************************************

4.2 How can I get/build a cable for my HP48?

    Some places that sell the HP48 also sell the cable required for
    interfacing with a PC.  Unfortunately, most don't.  
     
    For information on how to build your own cable, see appendix H.
    
    If you want to buy one, there are a few options.  Places
    like Educalc and ElekTek (see q/a #1.3) sell them for around $20-$25.
    
    There are a few netters that make cables for sale also.  Contact:
    Paul Christenson  
    Joel Kolstad    
    Ofer Asif  
                          
    If you live in a larger city, you can look in the Yellow Pages
    for a listing of HP authorized dealers who either have the
    cables in stock or can order them in about the same time a 
    mail order place can, but for a lower price..

******************************************************************

4.3 Why doesn't the I/R port work farther than a few inches?

    It turns out that it is the receiver that is "crippled".  The
    transmit range is somewhere around several feet, and some people
    have actually written programs to make the HP 48 emulate some
    remote controls (see appendix I for suggested programs).

   NOTE:  There are currently two stories going around as to WHY.  I 
    will present both of them in the interest showing all sides of the 
    story, but I personally lean to #1 (due to the source), but people 
    will bet their life on #2.. YMMV (Your Mileage May Vary!) 
    
#1  The head of the HP48 design team, Dr. William Wickes himself, alluded 
    during the Chicago Handheld Conference that the IR was intentionally 
    crippled due to the concerns of certain individuals in academia that 
    students could literally 'beam' information from one 48 to another 
    during examinations. (from Rick Grevelle)

#2  The reason the ir reception distance is so short is battery capacity.  
    The Infrared Transmitter is semaphore: It is only turned on when it 
    needs to be on, and the transmission protocol is defined to minimize 
    the ON time.  The receiver, by contrast, must be on continually when 
    a transmission is in process, or when a transmission is expected. If 
    you set your '48 to Server mode, that receiver is drawing power. If 
    you tweek the control bits to activate the receiver for any other 
    reason, it is drawing power. 
    The intantaneous peak power drawn by the transmitter is much higher 
    than that of the receiver.  But in the long run, the receiver will 
    draw more energy from the batteries.  Increasing the receiver 
    sensitivity costs even more power. 
        
******************************************************************

4.4 Can my HP48 talk to my HP100LX via Infrared?

    Yes, it can, although slowly.  Set the HP100LX at 2400 baud, and put 
    it in server mode (under the Kermit Commands menu).  THen you can 
    send stuff from your HP48 to your HP100LX

******************************************************************

4.5 I downloaded a program to my HP, and when I ran it, it put a string 
    on the stack like "HPHP48-.......".  What's wrong? 

    Some versions of kermit distinguish between ASCII and binary files,
    and so you have to worry about the transfer modes at *BOTH* ends of
    the connection (the HP 48SX end and the computer end).  For example,
    when receiving ASCII files, Unix kermit must translate CR/LF pairs
    into LF.  If the HP 48SX is transmitting a binary file, but the Unix
    kermit is expecting ASCII, any CR/LF pairs in the binary file will get
    translated to LF, corrupting the binary file.  Unfortunately, you
    cannot "uncorrupt" the corrupted binary file by simply reversing the
    transfer and expecting kermit to translate LF to CR/LF.  This is
    because the binary file may contain occurrences of LF that were not
    originally part of a CR/LF sequence.

    When a binary file gets corrupted, it will display on the stack as a 
    string, starting with the characters "HPHP48-", and continuing on with 
    a bunch of garbage.  Thanks to two programs, these strings can be 
    reconverted to binary files right on the HP48.  These programs are: 
    FIXIT, by Joe Horn and Mika Heiskanen, or OBJFIX, written by our 
    friends at HP.  These are included in appendix F in ASC form (ASC is 
    in appendix A)
         The major difference between FIXIT and OBJFIX  is the way they 
    operate.  I have never personally had any problems with either.  
    FIXIT takes the bad "HPHP48-" string from level 1 of the stack, and 
    replaces it with the correct binary object.  OBJFIX takes the name of 
    the variable in which the "HPHP48-" string is stored from level 1 of 
    the stack, and puts the correct binary object directly in the 
    variable where the bad string was stored.  It's up to you which you 
    prefer.  I would suggest reading the docs of both (included in 
    appendix F) before using either of them. 

    There is also a quick fix availabe from Dan Kirkland:

    ----- begin ----- 

    SYSEVAL fix for "HPHP48-X!@#$%^&*( 
    by Dan Kirkland, 08 Dec 1993

    Here is a simple SYSEVAL program that will return a pointer to
    the object in those data transfer strings that start with
    "HPHP48-

    BYTES: # 8FEh  53
 
    << "12" SWAP + # 402Bh SYSEVAL # 62B9Ch SYSEVAL >>

    That's all!  (Simple huh!) 
    Name?  Whatever you want!!
    Works on all 48s (S/SX, G/GX)
    ----- End --------

******************************************************************

4.6 Why does XRECV not work sometimes? (GX)

    Pre-Rev R. G Series 48's had a bug that would sometimes cause XRECV 
    to fail if there was not twice the amount of room free for the 
    incoming file. FXRECV, a fix for this bug, is available on the Horn 9 
    disk in the directory \hp as FXRECV.  There is more info about this 
    bug there as well. 

******************************************************************

4.7 What do the funny symbols \->, \GS+, etc., mean?

    These are the ASCII representation of the special HP 48 graphical
    characters.  See the section "Character Translations" in the manual 
    for a table of symbols <--> ASCII representations. 

SX: Chapter 33 (Volume II if 2 volumes) 

GX: Page 27-16 HP 48G Series User's Guide

******************************************************************

4.8 What are the pinouts for the HP 48 serial connector?

    Looking at the pins of the HP 48 (the following diagram is showing
    the pins on the HP 48, as you look *AT* the calculator):
                   _________
                  | o o o o |
                   \_______/
                    ^ ^ ^ ^
                    | | | \------ 4 Signal GND
                    | | \-------- 3 RX (input to the HP 48)
                    | \---------- 2 TX (output from the HP 48)
                    \------------ 1 SHIELD

    Stated another way:

        HP48                    IBM 9 PIN               IBM 25 PIN
        (From the outside
         edge -> inward)
        SHIELD-------------------  SHIELD----------------  SHIELD
        TX (Output)<-------------2 RX (Input)------------3 RX (Input)
        RX (Input)-------------->3 TX (Output)---------->2 TX (Output)
        SGND---------------------5 GND-------------------7 GND

    This information is also on page 27-7 of the G/GX manual.

******************************************************************

4.9 Is there any information on interfacing to the HP 48?

    HP has made available an UNSUPPORTED document called the "HP 48 I/O
    Technical Interfacing Guide", which contains information on the
    wired and serial I/O hardware.

    Look in the various HP 48 archives for a copy.

******************************************************************

4.10 How can I transfer programs/data from my HP-28S to my HP 48?
        
    You use a program called "INPRT", which is avaliable on GD #9.  Any
    previous version will crash the GX.  The new version's checksum is
    #EDF3h, and the old, SX-only version's checksum is #2280h.

    For each program that you want to transfer, you use the HP 28S to
    print it to the I/R output; INPRT, running on the HP 48, reads the
    I/R output of the HP 28S and converts it into a program.

*****************************************************************

4.11 Can I use rechargeable batteries with the HP 48?

    The Rayovac "Renewal" batteries have proven themselves to be reliable
    in the HP48, but there are some problems with ni-cad batteries. 
    You'll have to decide if using rechargeable batteries 
    is worth putting up with the problems:
      
      * You'll have to change batteries more often with rechargeable
        batteries.  Alkaline batteries can deliver power for a longer
        period of time, compared to rechargeable batteries.

      * Once the low-battery indicator comes on, you'll have to change
        the rechargeable batteries pretty quickly.  With rechargeable
        batteries, you have only a few minutes before the calculator
        dies (it's been said that you have up to 15 minutes or so).
        With alkaline batteries, you have an amount of time that is
        supposedly measured in hours. 

      * Ni-Cad batteries lose their charge with time, even if you are
        not using them.  Even if a Ni-Cad battery is just sitting unused
        on a shelf, it slowly loses its charge.  Alkaline batteries keep
        their charge for a very long time.
******************************************************************

4.12 How can I tell, from within a program, if the battery is low?


    The following 48 program reports the status of the ALERT
    annunciator.  The ALERT annunciator is activated by alarms or low
    battery.

    This program is provided free of charge "as is" and has no warranty.
    No one is liable for any consequential damages.
    Preston

%%HP:T(3)A(D)F(.);
\<<
RCLF
8 STWS #FFh #0h +
#10Bh
#6595Ah SYSEVAL
#8h AND #0h >
SWAP STOF
\>>

******************************************************************

4.13 My RAM card was plugged into the calculator when I changed the RAM
    card battery, yet I lost all the information on the card.  What
    happened?

    You forgot to turn ON the calculator before changing the battery.  
    The HP only supplies power to the RAM card while the HP is turned on.  
    While the calculator is turned off, no power is supplied by the 
    calculator, and all power comes from the RAM card battery.  If you 
    then take out the battery from the RAM card while the calculator is 
    turned OFF, the RAM card has no source of power, and you will lose 
    all of the contents in the RAM card. 

******************************************************************

4.14 Why do I get an "Invalid card data" error when I merge a RAM card?

    This message is usually seen when you plug a brand-new RAM card into
    an HP 48.  In this case, this message is normal and is harmless.  It
    just means that there was no (valid) data on the card.

GX: This message can appear when a RAM card contains ports you have 
    never used.  Press purple/left shift-LIBRARY. Hit NXT, then the 
    PINIT softkey.  This will initialize all available ram ports.  It 
    does not affect data already stored on the card.

    If you see this message under any other conditions, it could be one of
    the following:

     1. You took the battery out of the RAM card while the card was out
        of the calculator, therefore erasing the memory.

     2. You took the battery out of the RAM card while the card was in
        the calculator *BUT* the calculator was turned off.  Note that
        the calculator supplies power to the RAM card ONLY when the
        calculator is turned *ON*. Again the memory on the card is 
        gone.

     3. The RAM card battery is dead.

     4. There is a problem with either the calculator, the RAM card, or
        both.
    
    If the battery is operational, then try to store something on the 
    card.  If you still get the error message, then backup all your 
    info to a computer or another 48, and do a hardware reset. (see 
    #13)

******************************************************************

4.15 I've heard that other manufacturer's RAM cards will work with the
    HP 48.  Is this true?  Will it work?

    While some cards may work, there is a chance that you may severely 
    damage your HP 48.  You should only use cards specifically designed 
    for the HP 48.  Naturally, HP sells such cards, and some third 
    parties also make cards that will work in an HP 48.  Some cards 
    work with both the S/SX and the G/GX.  Some, however only work on 
    the S/SX, or only on the G/GX.  Make sure that the card is designed 
    to work for your version before using it.
    
SX: The S/SX can only naturally support up to 128k per port.  HP sells 
    32K and 128K RAM cards.   However, TDS, using software "bank 
    switches" produces 256K and 512K RAM cards.  These bank switching 
    cards do not work in the G/GX series.  CMT is also a makes 128K 
    cards, which work in all HP 48 calculators.
    
GX: While you cannot use the TDS 256K and 512K cards, Sparcom has come 
    out with 256K and 512K cards for the G/GX only.  HP also sells 1MB 
    RAM cards that work for G/GX only.  The G/GX is able to accept a 
    4MB RAM card, but none are on the market at this time.
    
    For more info on using non-HP 48 RAM cards in the S/SX series, see 
    appendix B near the end of this file. 
    
******************************************************************

4.16 Why does the HP 48SX display flicker slightly?

    Display flicker is usually caused by fluorescent lights.  The rapid
    pulsing of the fluorescent lights (60Hz in the U.S.), which is
    normally unnoticeable, interacts with the rapid pulsing/scanning of
    the HP 48 LCD display (64 Hz refresh rate), which is also normally
    unnoticeable.  The 60Hz fluorescent lights alias with the display
    refresh (64Hz) to produce a 4Hz "flicker".  It's normal and
    harmless.

    Outside the U.S., power is supplied at a 50Hz rate, not 60Hz.  This
    means that the display "flickers" at a 14Hz rate, which is still
    noticeable.

******************************************************************

4.17 I broke the LCD screen is there an easy way to get another?
    
    Unfortunately, as far as I am aware, you cannot get a replacement, the 
    cheapest alternative is to send the calc in for "standard service" at 
    HP, which is slightly cheaper than a new calculator.  Opening a 48 is 
    quite difficult anyway.  

******************************************************************


V.  Questions about programs


******************************************************************

5.1 Where can I get programs and information for the HP 48SX?
    
    See Appendix I for more info.

******************************************************************

5.2 What are the Goodies Disks and where do I get them?
    
    See Appendix 4 of Appendix I for more info.

******************************************************************

5.3 How do I get access to the HP Calculator BBS?

    You can access the HP Calculator BBS via a modem (note that this is
    a long distance call for most people):

        (503)-750-4448          2400 baud, 8N1
        (503)-750-3277          9600 baud, 8N1

    For those people who have access to the Internet, you can also
    access the BBS via telnet to hpcvbbs.cv.hp.com [15.255.72.16].

    See Appendix I for more BBS sites.

******************************************************************

5.4 What are files that end with ".zip", ".Z" or ".z"?

    Files that end with ".zip" are PKZIP archives, which originated in
    the MSDOS world.  One program that can extract the files in ".zip"
    archives is the Info Zip "unzip" program.  An MSDOS binary can be
    found as:

          wuarchive.wustl.edu:/systems/hp/hp48/Posting/unz50p1.exe

    Sources for the unzip program can be found as:

          wuarchive.wustl.edu:/systems/hp/hp48/Posting/unz50p1.zip

    For binaries for other machines, see the file:

          wuarchive.wustl.edu:/systems/hp/hp48/Posting/README

    Files that end with ".Z" have been compressed using the Unix
    "compress" command.  To uncompress these files, you must use the
    "uncompress" command on Unix.  

    Files that end with ".z" have *probably* been compressed using the
    new "gzip" compression command.  To uncompress these files, you must
    use either the "gunzip" or "gzip -d" command.  These commands are
    not a standard part of Unix, and so you'll probably have to get the
    sources via anonymous ftp from prep.ai.mit.edu (as /pub/gnu/gzip*).
    Again, versions are supposedly available for non-Unix platforms.

******************************************************************

5.5 What is a "ship" file?

    In the past, programs for the HP 48 posted on comp.sources.hp48 were 
    posted in the "ship" format.  This format made it easier for the 
    comp.sources.hp48 moderator to distribute programs, but makes it 
    difficult for users to extract and use these programs.   Many people 
    still use ship. 

    To extract programs distributed in the "ship" format, you need the
    following:

     1. A copy of the "ship" program, compiled for your PC, Macintosh,
        Amiga, Unix workstation, or whatever.  The sources to "ship" can 
        be found at:

        cbs.cis.com: /pub/hp48g/dos/unship.zip

        This zip file also includes the dos executable.
    
        Binaries for MSDOS machines, Amigas, and some Unix workstations
        can be also be found on wuarchive.wustl.edu, in the directory
        "/systems/hp/hp48/Posting/ship_executables".

     2. A copy of the latest Info Zip "unzip" program, or a .ZIP
        unarchiver that understands the new PKUNZIP V2.04g format.  Note
        that you *CANNOT* use old unzip programs, as old unzip programs
        do not understand the new compression formats.  An MSDOS binary
        can be found as:

          wuarchive.wustl.edu:/systems/hp/hp48/Posting/unz50p1.exe

        Sources for the unzip program can be found as:

          wuarchive.wustl.edu:/systems/hp/hp48/Posting/unz50p1.zip

        For binaries for other machines, see the file:

          wuarchive.wustl.edu:/systems/hp/hp48/Posting/README

    Once you have a copy of the "ship" and "unzip" programs, you use
    "ship" to convert the ship-encoded file into a .ZIP file, and you
    use the "unzip" program to extract the HP 48 files from the .ZIP
    file.

******************************************************************
    
5.6 What is \->ASC or ASC\-> and where can I get it?
    
    These functions were written by William Wickes to facilitate
    transferring HP 48 binary objects in an ASCII format (useful when
    transferring objects via electronic mail or bulletin boards).  Some
    HP 48 objects, like libraries, cannot normally be converted into
    ASCII, unlike program objects, and these functions make it possible to
    do so.
    
    The \->ASC function converts the object in level 1 into an ASCII
    string, which can then be uploaded to a computer for mailing.
    
    The ASC\-> function converts the string object in level 1 back into an
    object.  A checksum is used to ensure that the decoding is correct.
    
    A copy of these programs are given in Appendix A, near the end of this
    file.

******************************************************************

5.7 What is the HYDE library, and how do I get rid of it?

    The HYDE library is a library that changes the messages on your HP48.
It works on all versions of the HP48 and is available on Goodies Disc #2.
The program (HYDE.TXT) is in the DNICKEL directory needs to be converted
with ASC->. The instructions (HYDE.DOC) for the program are in the HORN2
directory.  The library is 3679.5 bytes, small enough to keep on your HP48
so you can install it on a friend's when he/she is not looking. :-)

    Here are a few examples of the changed messages:

        Invalid Syntax          =>      Makes no sense to me!

        ____ Error:                     ____ foul-up:
        Too few arguements      =>      Gimme some args, man!

        Empty Stack             =>      The well has run dry!

        Awaiting server Command =>      So tell me what to do.

        Connecting              =>      Anybody out there?
    
    To install the library:

     1. Download the library to your HP48
       
     2. Go to HOME.

     3. Recall the library to the stack and purge the download variable.

     4. Press 0, the STO.

     5. Put :0:998 on the stack.

     6. Type ATTACH

     7. Turn your HP48 off, then back on.

     8. Push Right-shift then the Library button.

     9. Press STRA.

     10. Press HYDE.


    Getting rid of the HYDE library can be fun.  Here's how to do it:

     1. Go the HOME directory.

     2. Press left-shift (orange) LIBRARY.  The calculator is now
        displaying a menu of libraries attached to the HOME directory.

     3. Press the menu key that says "STRA".  You are now accessing the
        HYDE library.

     4. Press the menu key that says "JEKY".  You have now disabled the
        HYDE library and restored the old (standard) set of messages.

     5. Make sure that a pointer to the library is not on the stack.  The
        easiest way to do this is to clear the stack using CLR.

     6. Detach the library using:

          :0:998 DETACH

     7. Purge the library using:

          :0:998 PURGE

        When you execute the PURGE, the screen will "jump" or "be messed
        up" for a brief moment.  Don't worry about it -- it doesn't
        hurt.

******************************************************************

5.8 What is the Minehunt game, and how do I use it? 

   The Minehunt game is a game built in to the G/GX, and included on 
   the HP EQ library card.  

GX: It is located in the UTILS menu of the left-shift(purple) EQ LIB menu. 
    (Left-Shift {EQ LIB], {UTILS}, {MINEHUNT}).  See page 25-14 of the 
    manual for a game explanation and picture.

SX: It is located in the UTILS library. 

   You can save a game by pressing the STO button. This creates a variable 
   with the name MHpar. If you are in the directory containing that 
   variable, you will resume your old game when you run MINEHUNT.

   To select the number of mines for your next game just store a number 
   in a variable, Nmines (it's case sensitive), and you'll get that 
   many mines.  If you store a negative number, you'll get the absolute 
   value of that many mines, AND all mines will be visible.

   You can also move diagonally if you use the numbers as arrows:
   1 is down+left, 2 is down, 3 is down+right, 4 is left, 6 is right,
   7 is up+left, 8 is up, and 9 is up+right.

******************************************************************

VI.  Questions about programming and advanced user functions

******************************************************************
  
6.1 I've heard the names "RPL", "Saturn", "STAR", "Voyager", "GL", etc..  
    What do they mean?

    ASAP
        This is a simple Saturn assembler, written in the Perl language.

    Chip8, Chip48, Schip, Schip8
        This is a machine-code program that was inspired by the chip8
        video game interpreter for the RCA CDP1802 microprocessor
        several years back.  Chip8 allows you to write a simple
        graphics-based video game for the HP 48SX.  Among the games
        written are "clones" of breakout, pacman, and pong, to name a
        few (about half?).

        Chip48, Schip and Schip8 are two different names for an enhanced
        version of chip8 specifically designed for the HP 48SX.  People
        have written programs to assemble Schip assembly language into a
        form directly usable by Schip on an HP 48.  Schip interpreters are 
        available for both G and S series.

    HYDE
        This is the "HYDE" library, whose only purpose is to change the
        error messages in the HP 48SX to make it "user unfriendly".

    GL
        GL (Game Language) is a language for the programmer who wants 
        almost the speed of assembly, but who doesn't want to spend a lot 
        of time and effort to learn all the tricks of assembly programming 
        on the HP48. GL has an assembly-like syntax, and there is an 
        assembler for PC and one for the HP48 itself. Since GL is an 
        interpreter, the GL library (3 KB in size) must be installed on the 
        HP48 to run GL programs. The instruction set is powerful, with 
        sprites and pixel based graphics, scrolling, sound, keyboard 
        control, and more. There are 256 1-byte registers which can be used 
        in pairs as 2-byte words. A GL program can be up to 64 KB in size. 
        GL was inspired by S-CHIP, but it is much better in all aspects. It 
        is suitable for many applications, not only games, that require 
        high speed. Of course it works on both the HP48S/SX and the G/GX. 
        GL is written by Erik Bryntse. 
        
    ML
        Machine Language.  This is usually used in reference to HP 48 
        assembly language programming.

    MLDL
        Machine Language Development Library.  This is a library that 
        allows you to debug machine language programs with only an HP 
        48. 

    PDL
        "Program Development Link".  This is an MSDOS program, sold by
        Hewlett-Packard, that allows you to write and develop HP 48
        applications from your IBM PC clone.  Programs are written on
        your PC, transferred to the HP 48, and tested from your *PC*
        (and *not* the HP 48).

        
    RPL
        RPL is the name of the language used to program the HP 48 and
        HP-28 series calculators.  RPL stands for "Reverse Polish Lisp".
        It's interesting to note that an HP Journal article incorrectly
        described RPL as "ROM-based Procedural Language".

    SASS
        SASS is a simple Saturn assembler, written in C/yacc (BSD Unix &
        Bison).  It uses Alonzo Gariepy's mnemonics.

    Saturn
        "Saturn" is the internal code name for the processor used in the
        HP 48, HP-28 series, and many other calculators (just about all
        HP calculators since the HP 18/28 series).

    STAR
        This is the "Saturn Macro Assembler" (how "STAR" comes from
        this, I don't know), an assembler that mostly uses Alonzo
        Gariepy's mnemonics.  It's written in C and runs on many
        different machines (PCs, Amigas, Unices, etc.).  STAR is
        available via anonymous ftp from ftp.ai.mit.edu in
        "/pub/star-1.04.4.tar.Z".  [Note: Rumor has it that this is 
        no longer available at this site.  If you know of a more 
        recent site, email the maintainer please.]  It's also 
        available from various bulletin boards (the HP handhelds 
        forum on CompuServe also has a copy).  The latest version 
        is "1.04.4".

    SWING
        SWING is a library program that displays a graphical tree
        structure of the directory hierarchy in your HP 48SX, and allows
        you to move from directory to directory using the arrow keys (it
        is supposedly based upon an old PD VMS utility).

    System RPL
        This is the name for the custom "operating system/language" used
        to program the CPU used in the HP 48 calculator.  System RPL
        is a superset of the normal user RPL commands; in addition to
        the normal, user-accessible RPL commands, system RPL includes
        many lower-level functions.  System RPL is a language one step
        higher than assembly language.

        HP has released a system development toolkit (for the IBM PC)
        containing a system RPL compiler, assembler, and loader,
        complete with a couple hundred pages of documentation.  This
        toolkit, while copyrighted, is, for the most part, freely
        copyable.  If you can find a BBS or archive site that has it,
        you can download all of the system RPL files and documentation.

        The HP development toolkit only runs on the MS-DOS operating 
        system. Alex Ramos has written a portable system RPL compiler 
        which runs primarily on Unix systems, and can emulate most of the 
        features available on the HP kit. The program is called RPL#+ (in 
        an analogy to 'C++'). RPL#+ is available from Ramos's email 
        server: send a message to ramos@engr.latech.edu with a Subject 
        line that reads: 
        "send hp48/rpp199c.zip" 
        without the quotes, and a daemon program will reply. 
        The program currently runs fine on Sun/OS 4.x, but bugs have been
        reported on other systems, including Linux (bugfixes welcome).

    USRLIB
        USRLIB is a program that takes the contents of an HP 48
        directory and turns it into a library object.  It currently runs
        under MSDOS.

    Voyager
        Voyager is an "interactive disassembler" for IBM PC clones that
        disassembles HP 48SX RPL and machine code.  You download a copy
        of the RAM *and* ROM in your HP 48SX to your PC, and run
        Voyager.  Using Voyager, you can then view the disassembled or
        unthreaded code.  Unfortunately (or fortunately), Voyager uses
        the HP mnemonics, and not Alonzo Gariepy's mnemonics.  Voyager
        is available from the HP BBS (I think), via anonymous ftp from
        the HP BBS (hpcvbbs.cv.hp.com [15.255.72.16]), and from various
        bulletin boards (the HP handhelds forum in CompuServe also has a
        copy).  The latest version is "1.07".

******************************************************************

6.2 Is there a C compiler for the HP48?
    
    Yes. Alex Ramos has written a GNU C back-end for the Saturn
    processor.  Location: ftp.engr.latech.edu:/pub/alex/hp48/ (look
    around for latest version). 

******************************************************************

6.3 Why do SysRPL programs run faster than UserRPL programs?

    SysRPL is the built in language, custom designed for the Saturn 
    processor used the HP48 family. UserRPL is a "subset" of SysRPL.  The 
    main reason for the speed difference is the fact that UserRPL commands 
    have built in argument and error checking.  In SysRPL, the programmer 
    is responsible for all error checking to avoid memory clears.
    
******************************************************************

6.4 How do I know what library ID number to use for my program?

[Note: While this document says 48SX, it is also valid for GX]

HP 48SX Library ID Numbers
Paul Swadener, HP Developer Support.
03 Sep 1993

The HP 48 will become confused if two or more libraries currently in
the machine have the same ID numbers. To help third party developer
efforts, HP maintains a list of HP 48 Allocated Library ID Numbers.

Below are the "rules." The penalty suffered from not following these
rules is that your library may not work if another library is in the
machine with the same number.

a. Don't use any number in the range 000h through 300h. These are
   reserved for HP's use.

b. Don't use any number in the range 301h through 5A0h unless you have
   been assigned that number by HP. These numbers are reserved for
   developers who are in the business of distributing their software,
   that is, Independent Software Developers.

   To apply for the allocation of an ID# contact Paul Swadener,
   Hewlett-Packard Company, 1000 NE Circle Blvd., Corvallis, OR 97330,
   fax number 503-750-2192, internet address
   paul_swadener@hp6400.desk.hp.com. You must be a registered
   developer and supply the name/nature of your product, and current
   shipping address and phone/fax/internet add./etc.

c. Use a number in the range 5A1h through 600h for experimental work
   and software. HP does not track the use of these numbers. 
 
d. Use a number in the range 601h through 6F6h for your personal
   applications, those which you will share, if at all, only to a
   known set of other users for personal uses. HP does not track the
   use of these numbers.

e. Don't use any number in the range 6F7 through 6FF, as these numbers
   were allocated before the formal allocation process in b. was
   instituted.

f. Don't use any number above 700h. These are also reserved for use by
   HP.

Hope this helps clear up how library numbers work.
 
----- end ----- 

******************************************************************

6.5 What information is there on the internals of the HP 48?

    The most important documents are part of the "System RPL" development
    tools, a completely unsupported set of IBM PC tools created by HP
    Corvallis (the creators of the HP 48).  The tools, which run on
    MSDOS machines only, contain documentation on:

        * System RPL (which includes information on HP 48SX display
          graphics, keyboard control, etc.).
        * Saturn assembly language ("Saturn" is the name of the CPU in
          the HP 48), including information on a Saturn assembler.
        * A system RPL compiler.
        * A Saturn object file linker.

    The completely unsupported system RPL development tools and
    documentation are available to customers free of charge to help them
    in HP 48 application development, subject to certain legal terms,
    which are given with the tools (they're too long and detailed to
    give here).

    You can get a copy in one of the following ways:

        * Anonymous ftp to hpcvbbs.cv.hp.com [15.255.72.16].
        * Get Goodies Disk #4. For info, see Appendix I.

******************************************************************

6.6 Are there any viruses for the HP48?

    There are several, and most are French.  In the United States, a 
    virus called the "Michigan virus" erupted a couple of years ago.  
    There is a program on Goodies Disk #8 that checks for the Michigan 
    Virus.  Currently, viruses do not pose an appreciable threat on HP48's 

******************************************************************

6.7 How do I store fields of variable length string data in a compact,
    rapidly accessible manner that does not require the overhead of
    storing strings in lists?

    See Appendix E, "Compact Data Storage", near the end of this file.

******************************************************************

6.8 What is "Vectored Enter", and how do I use it?

    [NOTE: This works in the G/GX series as well]
    
    From: billw@hpcvra.CV.HP.COM (William C Wickes)

    The HP 48SX manuals do not document a very powerful feature that we call
    "Vectored ENTER," that allows you in effect to redefine or bypass the
    command line parser and to have a shot at the stack etc. after the command
    line has been executed.

    Keys that execute an automatic ENTER perform a two-step process:

    1.  The command line is parsed and evaluated.
    2.  The key definition is executed.

    When flags -62 and -63 are both set, the system extends this process as
    follows:

    1.  The current path is searched for a global variable named *aENTER
    (here "*a" is the Greek alpha character--character 140).  If present,
    the command line is entered as a string object and *aENTER is
    executed.  If absent, the command line is parsed and evaluated
    normally.

    2.  The key definition is executed.

    3.  The current path is searched for a global variable named *bENTER
    ("*b" is Greek beta--character 223).
    If present, then a string representing the key definition is put on the
    stack, and *bENTER is executed.  The string is the key definition
    object's name if it is a command, XLIB name, global or local name, or
    an empty string for other object types; its primary purpose is to implement
    things like the TRACE mode on other calcs, where you can print a running
    record of what you do.

    A simple example of the use of *aENTER is to create a more convenient
    binary calculator, where *aENTER slaps a "#" on the front of the command
    line so you don't have to bother when entering numbers.

******************************************************************

6.9 What is "WSLOG"?

    It is an undocumented feature which stands for "Warm Start LOG".
    Type in WSLOG in caps, and calc will list the time and cause of the
    last four warm starts.  This feature helps HP tech to fix your baby,
    in case it crashes.

    0 - log cleared by   then 
    1 - low battery condition, auto deep sleep mode invoked to save battery
    2 - hardware failed during IR (time out)
    3 - run through address 0
    4 - system time corrupt
    5 - deep sleep mode wake up (alarm?)
    6 - unused
    7 - CMOS test word in ram was corrupted
    8 - abnormality was detected about device config
    9 - corrupt alarm list
    A - unused
    B - card module pulled
    C - hardware reset
    D - system RPL error handler not found in run stream
    E - corrupt config table
    F - system RAM card pulled

******************************************************************

6.10 What are SYSEVALs?

    SYSEVALs are addresses that point directly to a location in the HP48's
    ROM. Many SYSEVAL hex strings are System-RPL commands.  Because there is
    no arguement checking, it *VERY* easy to clear your HP48's memory.
 
    In the file SYMBOLS.GX, HP designates three types of entries.  The first
    type is "supported."  This means that a particular entry will work on ALL
    versions of the HP48 and HP supports the use of this entry.

    The second type of entry is "unsupported."  This means that HP does not
    support the use of this entry and it will not be the same on all versions
    of the HP48.

    The third type is "unsupported-static."  This is an entry to HP does not
    support the use of, but it is the same for all versions.

******************************************************************

6.11 What are some useful SYSEVALs?

    For a complete list of supported entry points, see the file
    cbs.cis.com: /pub/hp48g/uploads/48entry.txt

    In System-RPL, different HP object types are refered to by symbols.
    These symbols are used to construct stack diagrams, which tell the
    user how to use System-RPL commands.  Here are some of the symbols:

    Symbol  Type                        Example
    ------  --------------------        -----------------
    $       string                      "ABCDEFG"
    id      Global Name                 'A'
    arry    Array                       [[ 1 2 ] [ 3 4 ]]
    grob    HP48 Graphics Object        Graphic 131x64
    #       Binary Number               <1h>
    symb    Symbolic Object             'A^2+B^2'

    To interpret the stack diagram:
        Everything on the left of the -> arrow is the input.  That needs
        to be on the stack before executing the syseval.  The symbols 
        show you which kinds of data to put on the stack.  Once you 
        execute the syseval (see next paragraph), the HP will return 
        the data back that is indicated on the right side of the arrow.

    To use the following entries, do the following:
        1. Make sure (triple check) that the appropriate arguements are
           on the stack.
        2. Push Left-shift /, you should get a # on the command line.
        3. Enter the hex string exactly as shown in the hex string column.
        4. Put an small case h at the end of the hex string.
        5. Press enter.
        6. Type SYSEVAL.


Hex String      Sys-RPL Name        Catergory           Stack Diagram
----------      ------------        ---------           -------------

15777           NULLID              Supported           ( -> '' )
30794           VERSTRING               "               ( -> "HPHP48-?" )
3A328           MakeStdLabel            "               ( $ -> grob )
3A3EC           MakeDirLabel            "                     "
3A38A           MakeBoxLabel            "                     "
3A44E           MakeInvLabel            "                     "
3A1FC           DispMenu.1              "               ( -> )
05F42           GARBAGE                 "               ( -> )
41F65           WaitForKey              "               ( -> #KeyCode #Plane )
353AB           SYMB>IDS            Unsupported-static  ( symb -> list )
40D25           LockAlpha           Supported           ( -> )
40D39           UnlockAlpha             "                  "
3AA0A           1A/LockA                "                  "
44C31           DoNewMatrix             "               ( -> arry )
44FE7           DoOldMatrix             "               ( arry -> arry' T/F )
1314D           TOADISP                 "               ( -> )
13135           TOGDISP                 "                  "
39531           ClrDA1IsStat            "                  "
130AC           RECLAIMDISP             "                  "
4E347           TURNMENUON              "                  "
05B15           $>ID                    "               ( $ -> id )
05BE9           ID>$                    "               ( id -> $ )
3A1E8           DispMenu                "               ( -> )
39BAD           DispStack           Unsupported-static     "


******************************************************************

6.12 What are LIBEVALs?

[This answer was copied from Joe Horn's "libeval.doc" from GD #9]

The G/GX has a new command: LIBEVAL.  It's sort of like SYSEVAL, but
instead of taking a memory address (which could be ambiguous due to
the G/GX's massive need for bank switching), it takes XLIB numbers.
It's a "back door" for us hackers.  Unlike the ELSYSEVAL command in
the HP Solve Equations Library Card, which only worked for the
libraries in that card, LIBEVAL works for *any* library, including the
hidden ones in the operating system.

      CAUTION: LIBEVAL, like SYSEVAL, is both powerful and
      dangerous. If used with incorrect input(s) and/or in
      the wrong environment, it can nuke your memory.

LIBEVAL takes a single user binary integer of the form #LLLFFFh, where
LLL is the library ID (hex), and FFF is the three-digit function
number (hex, with leading zeros if necessary).

For example, the R->B command is XLIB 2 9.  So you can perform a R->B
by executing #2009h LIBEVAL.  Try it: 10 #2009h LIBEVAL -> #Ah.

Using it for named commands is unnecessary, but the G/GX is highly
XLIB oriented (again, due to the need for bank switching), and there
are many useful and interesting features accessible only thru LIBEVAL.

A prime example is the G/GX's inability to programmatically launch the
new "dialog boxes".  Suppose a program needs to print things; it would
be awfully nice to be able to throw the I/O PRINT dialog box onto the
screen.  The User's Guide is no help here, and in fact it would seem
impossible to do. But #B4197 LIBEVAL is all it takes!  Try it.  Cool,
huh?

******************************************************************

6.13 What are some useful LIBEVALs? (GX)

Function                                                 GX
-----------------------------------------------------+----------
                                                     |
Creates an XLIB name from two bints                  |  #7E50h
Displays message box with grob                       | #B1000h
CMD  last command window                             | #B2000h
CHARS application                                    | #B2001h
MODES application input form                         | #B41C1h
flag browser  (returns t/f to level 1, just drop it) | #B41CFh
MEMORY application  (aka variable browser)           | #B41D7h
SOLVE application choose box                         | #B4000h
solve equation input form                            | #B4001h
solve difeq input form                               | #B4017h
solve polynomial input form                          | #B402Ch
solve linear systems of equations input form         | #B4033h
solve TVM input form                                 | #B4038h
PLOT input form                                      | #B4045h
SYMBOLIC application choose box                      | #B4113h
integrate input form                                 | #B4114h
differentiate input form                             | #B4122h
Taylor polynomial expansion input form               | #B412Bh
Isolate a variable input form                        | #B412Dh
solve quadratic input form                           | #B4130h
manipulate expression input form                     | #B4131h
TIME application choose box                          | #B4137h
Set alarm input form                                 | #B4138h
Set time and date input form                         | #B415Bh
Alarm browser   (aka alarm catalog)                  | #B416Eh
STAT application choose box                          | #B4175h
single-var stat input form                           | #B4176h
frequencies input form                               | #B417Dh
fit data input form                                  | #B417Fh
summary stat input form                              | #B418Fh
I/O application choose box                           | #B4192h
Send to HP48 input form                              | #B4193h
Print input form                                     | #B4197h
Transfer input form                                  | #B41A8h
Get from HP48  (immediate)                           | #B50FFh
recalls the contents of the reserve variable Mpar    | #E4012h


******************************************************************

6.14 What is the format of a GROB object?

[NOTE: I received two very good answers to this question, and each
       cater to a different kind of user, so I will include them both.]

ANSWER A: The "easy" way:
-------------------------------------------------
First, add pixels to the right-hand edge to make the horizontal dimension a
multiple of 8, then separate the object horizontally into groups of four
pixels.  Suppose, for example, you want to make this into a 22x8 GROB:

                ---------****---------
                --------**--**--------
                -------**----**-------
                ********------********
                ********------********
                -------**----**-------
                --------**--**--------
                ---------****---------

You would break it up like this:
 
            ---- ---- -*** *--- ---- ----
            ---- ---- **-- **-- ---- ----
            ---- ---* *--- -**- ---- ----
            **** **** ---- --** **** **--
            **** **** ---- --** **** **--
            ---- ---* *--- -**- ---- ----
            ---- ---- **-- **-- ---- ----
            ---- ---- -*** *--- ---- ----

Notice, I've added two columns of pixels to make it 24x8.  Now, each group of
four can be represented by a hexadecimal digit.

        ---- 0          --*- 4          ---* 8          --** C
        *--- 1          *-*- 5          *--* 9          *-** D
        -*-- 2          -**- 6          -*-* A          -*** E
        **-- 3          ***- 7          **-* B          **** F

Now, replace each group of four pixels with its corresponding hexadecimal
digit: 00E100  003300  081600  FF0CF3  FF0CF3  081600  003300  00E100.

So, your final grob is:

GROB 22 8 00E100003300081600FF0CF3FF0CF308160000330000E100 

-------------------------------------------------

ANSWER B: The "technical" way:
-------------------------------------------------

NOTE 1: Every HP object format is described in RPLMAN.DOC, see this
        file for more info.

NOTE 2: All HP objects are (of course) nibble based.  When viewing them
        on the PC, which is byte based, the low order nib is always read
        and written first.

NOTE 3: HP objects begin with a 5 nib prolog which identifies the object
        type (and other things).  This is the prolog for a grob object..

        02B1E pr HP:DOGROB
        02B1E @  Graphic prolog (/U GROB)

NOTE 4: Every 5 nib sub field of an object, such as prolog, length, etc.,
        is read in reverse order (low nib first).  The grob prolog would
        appear E1B20, or 1E 2B x0 in a hex dump on a PC.  The least
        significant nibble of the next field begins right at the x in x0.

NOTE 5: It is customary to always work with HP objects on the PC with the
        HPHP48-E header (substitute your favorite rom version letter)
        preceding the prolog.  This gives no hassles when downloading
        via Kermit or Xmodem.


PC hex dump of a grob object.. ( remember each 5 nib field is reverse order )

1_  "HPHP48-E" 8 byte ascii string with msb off
2_  5 nib prolog, 02B1E (hex)
3_  5 nib length field, includes length of body AND length and height fields!
    does not include 5 nib prolog.  So, the total #nibs the grob object
    takes in HP memory is this number + 5.  Important!
4_  5 nib height field  ( yes, it is height then width )
5_  5 nib width field
6_  body (described below)


The grob object looking at it using command line EDIT on the HP..

GROB   < body >
The body is exactly the same looking at it on a PC hex dump or on the
command line EDIT.  Just remember to read low nibble first for hex dump.


The grob body
-------------

Because of hardware restrictions, the number of nibs required to represent
one horizontal line must be even (byte aligned).  So, use this method
to calculate the number of nibs in one line..   (pascal example)

  nibs:= width div 4;
  if nibs mod 4 <> 0 then nibs:= nibs + 1;
  if odd(nibs) then nibs:= nibs + 1;

Then to get the #nibs in the entire body, multiply it by height.
! Remember, the length field must be this total body length + 15 !

For example, a 131 wide grob requires 34 nibs for one horizontal line,
where 5 of the bits are unused.  The first nib in the second line begins
at nib 35 for this grob, etc.
If the grob is 64 lines, then the body is 2176 nibs.
Add 5 for the prolog, 5 for the length field, 5 for height, and 5 for width.
Total object size (on the HP) is 2196 nibs, or 1098 bytes.
The length field should contain 2196 minus 5 for prolog = 2191 (0088F hex)

Note that for each nib, the right-most bit is the left-most pixel on the
screen.  This is nearly always the case for graphic memory.

******************************************************************


END PART 2 OF 4

Archive-name: hp/hp48-faq/part3
Last-modified: 12/12/94
Version: 3.01
Posting-Freqency: every 14 days or so

        *********************************************************
             HP 48 S/SX/G/GX  Frequently Asked Questions List
        *********************************************************
                      PART 3 of 4: Appendices A - H

       Currently Maintained by: Keith Maddock (madd0118@nova.gmi.edu)
                  Originally Compiled by: Darryl Okahata

Key: ! =new Q/A  + =revised answer 

PART 3:    
    * Appendix A: ASC\-> and \->ASC functions:
    * Appendix B: Using non-HP RAM cards in your HP 48SX:
+   * Appendix C: What's new in the HP 48G/GX
    * Appendix D: The EquationWriter Bug & Rev J Bugfix
    * Appendix E: Compact Data Storage:
    * Appendix F: Various useful functions
    * Appendix G: Rotation rate to angular frequency conversion bug
!   * Appendix H: How to make a Serial Cable for your HP48

******************************************************************

* Appendix A: ASC\-> and \->ASC functions:

Note: Since this appendix was written by Bill, I dare not modify it.  
However, I wish to note that ASC\-> and \-ASC do work on both the SX and 
GX versions.

>From: billw@hpcvra.CV.HP.COM (William C Wickes)

                      ASCII Encoding HP 48SX Objects

Sending an HP 48SX object via electronic mail can be difficult if the
object does not have an ASCII form, such as is the case for library
objects.  There are various encoding schemes available on different
computer systems, but these require that the sender and receiver have
similar computers, or at least compatible encode/decode schemes.  The
programs listed below perform the encoding and decoding on the HP 48SX itself,
which has the advantage of being completely independent of any computer.

The programs are nominally called \->ASC and ASC\->.  The former takes an
object from the stack and converts it to a string, in which each nibble of the
object and its checksum is converted to a character 0-9 or A-F.  (The object
must be in RAM, otherwise a "ROM Object" error is returned.)  For sake of easy
inclusion in email letters, the string is broken up by linefeed characters
after every 64 characters.

ASC\-> is the inverse of \->ASC: it takes a string created by \->ASC and
converts it back into an object.  When you transmit the encoded strings,
be sure not to change the string; ASC\-> uses the checksum encoded in the
string to verify that the decoding is correct.  An "Invalid String" error
is returned if the result object does not match the original object
encoded by \->ASC.  When you upload a string to your computer, use HP 48
translate mode 3 so that the HP 48 will convert any CR/LF's back to LF's
when the string is later downloaded.

Two versions of ASC\-> are included here.  The first (P1) is in HP 48 user
language, using SYSEVALs to execute system objects.  P2 is a
string that the setup program uses P1 to decode into an executable
ASC\->--then P1 is discarded.  The second version is more
compact than the first, and also uneditable and therefore safer (but it can't
be transmitted in ASCII form, which helps to make the point of this exercise).

Here are the programs, contained in a directory:

(start)
%%HP: T(3)A(D)F(.);
DIR
P1              @ ASC\-> Version 1.
\<<
  IF DUP TYPE 2 \=/
  THEN "Not A String" DOERR
  END RCWS \-> ws
  \<< 16 STWS
    #0 NEWOB SWAP DUP SIZE
    IF DUP 4 <
    THEN DROP SWAP DROP "Invalid String" DOERR
    END
    DUP 65 / IP - 4 - # 18CEAh SYSEVAL
    "" OVER # 61C1Ch SYSEVAL
    SWAP # 6641F8000AF02DCCh
    # 130480679BF8CC0h # 518Ah SYSEVAL
    # 19610313418D7EA4h # 518Ah SYSEVAL
    # 7134147114103123h # 518Ah SYSEVAL
    # 5F6A971131607414h # 518Ah SYSEVAL
    # 12EA1717EA3F130Ch # 518Ah SYSEVAL
    # 280826B3012808F4h # 518Ah SYSEVAL
    # 6B7028080BEE9091h # 518Ah SYSEVAL
    # BE5DC1710610C512h # 518Ah SYSEVAL
    # 705D00003431A078h # 518Ah SYSEVAL
    # 3D8FA26058961431h # 518Ah SYSEVAL
    # 312B0514h # 518Ah SYSEVAL
    # 18F23h SYSEVAL
    DUP BYTES DROP 4 ROLL
    IF ==
    THEN SWAP DROP
    ELSE DROP "Invalid String" DOERR
    END ws STWS
  \>>
\>>

P2      @ ASC\->  Version 2.  To be converted by ASC\-> version 1.

"D9D20D29512BF81D0040D9D20E4A209000000007566074726636508813011920
140007FE30B9F060ED3071040CA1304EC3039916D9D2085230B9F06C2A201200
094E66716C696460235472796E676933A1B21300ED30FD5502C230C1C1632230
CCD20FA0008F14660CC8FB97608403104AE7D814313016913213014117414317
414706131179A6F5C031F3AE7171AE214F8082103B6280821909EEB0808207B6
215C0160171CD5EB870A13430000D50713416985062AF8D341508813044950B9
F06BBF06EFC36B9F0644230C2A201200094E66716C696460235472796E676933
A1B2130B21300373"


P3      @\->ASC.     To be converted by ASC\->.
"D9D20D2951881304495032230FD5502C230A752688130ADB467FE30322306AC3
0CB916E0E30CBD30F6E30C1C1632230CCD20DC0008F14660CC8FB97608403104
AE7D8143130169174147061741431311534AC6B4415141534946908D9B026155
4A6F53131F3AE731A014C161AE215F08082103A6280821939EEC08082170A621
4C161170CD56B870A18503430000D5071351796A9F8D2D02639916D9D2085230
C2A209100025F4D402F426A6563647933A1B2130A2116B213033C0"

SETUP   @Automatic setup program
\<< P2 P1 'ASC\->' STO
    P3 ASC\-> '\->ASC' STO
    { P1 P2 P3 SETUP } PURGE
\>>

END
(end)


Installation instructions:

    1.  Edit the above text between (start) and (end) into a text file
        named CONV (for example).  Be sure that you leave the strings
        exactly as entered above, with no extra spaces or other
        invisible characters at the beginnings or ends of the lines.
    2.  Set the HP 48SX into ASCII transfer mode.
    3.  Using Kermit, download CONV text file to the 48, verify its
        checksum (6C8Ah).
    4.  Execute CONV to make it the current directory.
    5.  Execute SETUP.
    6.  The directory CONV now contains ASC\-> and \->ASC, ready to
        use.

To archive the decoded versions of ASC\-> and \->ASC back on your computer,
be sure to set the HP 48SX in binary transfer mode before uploading.

Disclaimers:

+ Use the programs at your own risk.  Any time you delve into the SYSEVAL
world, there are increased dangers.  Archive your 48 memory before
experimenting with these programs!  Also, verify the checksums of objects
defined above to make sure they have been downloaded correctly, before
executing ASC\->.

+ I will not answer questions about how the programs work.  This is not
because of any great secrecy, but rather because it's hard to give
any answer that doesn't lead to more questions, and more, and more...

+ 48 hackers are welcome to mine any nuggets they can from the programs,
and from the fact that \->ASC is a convenient way to decompile an object.

******************************************************************

* Appendix B: Using non-HP RAM cards in your HP 48SX:

  If you use RAM cards that are NOT designed for the HP 48SX, it is
  possible to severely damage your HP 48SX.  If you want to be safe, you
  should only use RAM cards designed for the HP 48SX.

  Here is an edited discussion from comp.sys.handhelds.

  From steveh@hpcvra.CV.HP.COM Fri Mar  1 17:00:00 1991
  From: steveh@hpcvra.CV.HP.COM (Steve Harper)
  Date: Thu, 10 May 1990 22:46:09 GMT
  Subject: RE: HP48SX Memory Card Pricing
  Organization: Hewlett-Packard Co., Corvallis, OR, USA

  There has been a substantial  amount  of  comment  regarding  the
  memory cards for the HP48SX and their prices.  My purpose in this
  response is not to attempt to justify any particular  price,  but
  rather   to   present  the  technical  reasons  why  there  is  a
  substantial price difference between the memory cards  and  other
  types of expansion memory for PC's, for example, with which users
  are probably more familiar.

  Some users have correctly pointed out  that  the  memory  in  the
  cards  is  static  RAM  rather  than dynamic RAM commonly used in
  PC's.  Dynamic RAM uses one transistor and a capacitor  for  each
  bit of memory whereas static RAM requires either four transistors
  and two resistors, or six transistors.  The net result is that an
  equivalent amount of static RAM is much larger and therefore much
  more expensive than dynamic RAM.  The advantage  is  that  static
  RAM  doesn't  need  to continually be running and drawing current
  (refresh cycles) to retain the contents of memory.

  In addition, the static memory used in the cards is not just  any
  static  memory,  but  is  specially processed and/or selected for
  very low standby current.  This allows the backup battery in  the
  card  to  keep  memory  alive  for  a very long time, rather than
  requiring the user to replace it every few months.   The  special
  processing  and/or  special  testing  to select low current parts
  adds to the already higher cost of the static RAM chips.

  The standard molded plastic DIP package used for most  integrated
  circuits,  including  memory  chips,  is  relatively  inexpensive
  because of its simplicity and the huge  volumes.   Unfortunately,
  these  packages  are  too  large  to  put  into  a  memory  card.
  Therefore, the card manufacturer mounts  the  individual  silicon
  memory  chips  directly  on a special thin PC board together with
  the memory support  chips.   Because  multiple  chips  are  being
  placed  in a single hybrid package in a special process which has
  lower volume, yields are lower and this again causes the cost  to
  be  higher.  Indeed, the yield becomes exponentially worse as the
  number  of  chips  and  interconnections  increases  in  such   a
  packaging process.

  In addition to the memory chips themselves, two  more  integrated
  circuits  and  several discrete components are required for power
  and logic control.  A bipolar technology chip senses the external
  voltage  and  switches  the  power to the chips from the internal
  keep-alive battery as needed.  A CMOS gate  array  chip  protects
  the memory address and data lines from glitches/ESD when the card
  is not plugged in.  This chip also generates the proper  enabling
  signals  when  there are multiple memory chips in the card, as is
  presently the case with the 128 Kbyte RAM card.  These chips must
  be  designed  for extremely low current, just as the memory chips
  are.

  In addition to the battery and  the  battery  holder,  the  other
  mechanical  parts  are  important, too.  The molded plastic frame
  holds the PC board and provides  the  foundation  for  the  metal
  overlays  and the shutter-and-springs assembly which protects the
  contacts from  ESD  and  from  contaminants.   The  write-protect
  switch  is  also an important feature.  It is quite expensive for
  the manufacturer to make the tools necessary to fabricate each of
  these  parts  as  well  as  the  tools  to  assemble and test the
  complete card.  While the volume of memory  cards  is  relatively
  low  this  tooling cost represents a significant part of the cost
  of each card.

  Admittedly, there are other alternatives, such as those presently
  used  in  PC's,  to  provide  a  memory expansion capability.  To
  provide that kind of expansion would require the calculator to be
  much  larger  than  it  is  and possibly more expensive.  This is
  clearly very undesirable.

  Other features that were felt to be essential were the ability to
  distribute  software applications and to share and archive/backup
  user-created programs and data.  Other expansion alternatives  do
  not provide these important benefits.  The IO capabilities of the
  calculator provide these features only to a limited degree.

  One other item bears repeating here: Memory cards for use in  the
  calculator  will  clearly indicate that they are for use with the
  HP48SX.   Other  memory  cards  exist  which   are   mechanically
  compatible  with the HP48S, but these cards cannot be relied upon
  to work electrically in the calculator.   The  HP48SX  cards  are
  designed  for  a  lower  supply  voltage range.  Use of the other
  cards may cause memory loss, and under certain circumstances  may
  even damage your calculator electrically.

  From steveh@hpcvra.CV.HP.COM Fri Mar  1 17:00:00 1991
  From: steveh@hpcvra.CV.HP.COM (Steve Harper)
  Date: Fri, 11 May 1990 16:52:07 GMT
  Subject: Re: Memory Card: Give Us *True* Facts!
  Organization: Hewlett-Packard Co., Corvallis, OR, USA

  My previous statement that under certain circumstances the
  calculator may even be damaged electrically is not a ploy.
  If the calculator's internal power supply voltage happens to
  be near the low end of the range, say 4.1 V, and the voltage
  at which the card's voltage control chip shuts it down
  happens to be near the high end of its range, say 4.2 V (this
  can and does occasionally occur for the non-HP48SX cards),
  then the calculator will start to drive the memory address
  lines and the card will still have these clamped to ground
  (that's what it does to protect itself when there is not
  sufficient system voltage to run).  This unfortunate situation
  may simply trash your memory, or if the calculator tries
  to drive enough of the lines high at the same time, several
  hundred milliamps may flow...for awhile that is, until something
  gives up...  On the other hand, your calculator and a particular
  non-HP48SX card may work just fine if those voltages happen
  to be at the other end of their ranges.  These voltages are
  also slightly temperature sensitive.  It may work in the
  classroom or office and not at the beach, or vice versa.
  The voltage trip point of the HP48SX cards has been set
  lower (a different voltage control chip) so that this cannot
  occur, regardless of part and temperature variations.

  One other item was brought to my attention yesterday by
  Preston Brown that I should have included in my original
  posting here.  While most of us recognize that comparing
  ram cards to a handful of dynamic ram chips to plug into
  your PC is apples and oranges, it may be more interesting
  to compare the HP48SX cards with cards for other products,
  like the Atari Portfolio, the Poquet, the NEC Ultralite,
  etc.  I believe you will find that the prices on the
  HP48SX cards are not at all out of line.

  Steve
  "I claim all disclaimers..."

  the non-HP48SX cards

  From prestonb@hpcvra.CV.HP.COM Fri Mar  1 17:00:00 1991
  From: prestonb@hpcvra.CV.HP.COM (Preston Brown)
  Date: Thu, 17 May 1990 17:26:53 GMT
  Subject: Re: Memory Card: Give Us *True* Facts!
  Organization: Hewlett-Packard Co., Corvallis, OR, USA

  When the RAM cards detect that voltage is to low to operate they
  clamp the address lines to ground.  This clamping is done by turning
  on the output drivers of a custom chip included on the card.  The
  clamping current is speced at 2mA min at the Vol output level.  Since
  the 48 can be trying to drive the line all the way high even more
  current is typical.  10mA per fight is not uncommon with totals of
  several hundred mAs.

  The VDD power supply is regulated at 4.1 - 4.9 with typical
  parts at the low end (4.3).  The power to the cards is switched
  thru a transistor, creating up to a 0.1V drop.  Standard Epson
  cards have a significant chance of seeing this voltage as
  to low and shutting down.  We have seen cards do this in the lab.
  When it occurs the calculator locks up with VDD pulled down
  to about 2.5V and 250mA being drawn from the batteries.  This
  current drain greatly exceeds the ratings for the power supply
  and can damage your calc.  The least that will happen is a loss
  of memory.

  Now, why didn't we regulate VDD higher?
  The 48 has two power supplies VDD at 4.3 and VH at 8.5.  VH
  cannot be regulated higher without exceeding the spec for
  our CMOS IC process.  VH is used as the + voltage for the I/O.
  In order to meet a +3V output level VH must be more then 3.6V
  above VDD.  (VDD is used as I/O ground). Our power supply
  system increase the battery life and reduces the cost greatly
  for the wired I/O.

  Preston

******************************************************************

* Appendix C: What's new in the HP 48G/GX?

  [ The following was taken from a posting by Joe Horn.  ]

                           +--------------------+
                           |     WHAT'S NEW     |
                           |  IN THE HP48 G/GX  |
                           +--------------------+
   
                           collected & annotated
                             by Joseph K. Horn

   (1) AUTOMATIC LIST PROCESSING

       Almost all commands that did not accept list(s) as their arguments
       can do so now.  Here are just a few examples:

          { 1 2 3 } SF sets flags 1, 2, and 3
          { 1 2 3 } SQ  -->  { 1 4 9 }
          { 2 4 } 10 /  -->  { .2 .4 }
          10 { 2 4 } /  -->  { 5 2.5 }
          { 10 12 } { 2 4 } /  -->  { 5 3 }
          { .1 .2 .5 } ->Q  -->  { '1/10' '1/5' '1/2' }
          { freq freq ...} { dur dur ... } BEEP can play a song with no
            audible hiccup between tones.

       Since + has always been used to concatenate lists, a new ADD
       function exists to add the elements of two lists, like this: 

          { 1 2 3 } { 4 5 6 } ADD returns { 5 7 9 }, whereas
          { 1 2 3 } { 4 5 6 }  +  returns { 1 2 3 4 5 6 } as it did
            before.

       The only commands which do not have automatic list processing are:
          a. those which never get a Bad Argument Type error (like DUP),
          b. meta-object commands (like ROLL),
          c. program branch structures (like FOR), and
          d. commands that specifically work on lists (like GET).

       Sometimes the results are non-obvious, for example:

          5  { A B C }  STO           -->  A=5, B=5, C=5
          { 5 6 7 }  'A'  STO         -->  A={ 5 6 7 }  (same as on SX)
          { 5 6 7 }  { A B C }  STO   -->  A=5, B=6, C=7

       List processing is only recursive for ->Q and ->Qpi. 

   (2) PORTS AND MEMORY
 
       The HP48G, like the 48S, only has 32K RAM.  The GX, unlike the SX,
       has 128K RAM built-in.  Card slot 1 can contain another 128K
       (maximum), but card slot 2 can contain up to 4 megabytes of RAM. 
   
       Only port 1 can be merged in the GX.  Card slot 2, which is
       intended for large-capacity RAM cards, is permanently "free", and
       is automatically divided up into 128K "ports", each of which
       becomes Port 2, Port 3, Port 4, etc.  Up to 4 Megabytes can be
       plugged into slot 2, which would then become Port 2 through Port
       33. (Although the FREE and MERGE commands were kept for HP 48SX
       compatibility, GX users will prefer the new FREE1 and MERGE1
       commands).  Therefore the maximum amount of merged main memory is
       256K (unlike the SX which allowed up to 288K) after MERGE1; the
       maximum amount of fully online free independent memory is 4224K
       after FREE1.
   
   (3) LOCAL VARIABLES.
   
       Variable names prefixed with a <- (backarrow character) are
       compiled as local (temporary) variable name objects even if
       they're not explicitly after FOR or ->.  This allows programs to
       share values through local variables, which is much faster than
       sharing values through global variables, and they get purged
       automatically.
   
   (4) SPEED.
   
       CPU clock speed is double the S/SX's, but throughput is estimated
       to be only 40% faster, primarily due to the fact that *all* RAM &
       ROM is now bankswitched (on the S/SX only a 32K portion of the ROM
       required bank switching), and it still has the same 4-bit bus
       bottleneck.
   
   (5) IMPROVED COMMANDS:
   
       AXES can now also specify the spacing of the tick marks.
       DEPND can now also specify the initial values and tolerance
             for the new DIFFEQ plot type.
       REPL and SUB now work on arrays. 
   
   (6) HP SOLVE EQUATION LIBRARY CARD COMMANDS:
   
       AMORT, amortization calculations
       CONLIB, starts Constants Library catalog
       CONST, returns value of a named CONLIB constant
       DARCY, calculates Darcy friction factor
       EQNLIB, starts Equation Library catalog
       F0lambda, calculates black-body power fraction
       FANNING, calculates Fanning friction factor
       LIBEVAL is a generalized form of the EQ card's ELSYSEVAL; it
               executes any XLIB by its library number 
       MCALC, marks an MSOLVR variable as "not user-defined"
       MINEHUNT, starts the "Minehunt" video game
       MINIT, initializes Mpar from 'EQ' for MSOLVR
       MITM, customizes title & menu of MSOLVR's screen
       MROOT, solve for variable(s) in MSOLVR
       MSOLVR, shows Multiple Equation Solver menu
       MUSER, marks an MSOLVR variable as "user-defined"
       SIDENS, density of silicon as function of temperature
       SOLVEQN, starts solver for specified EqLib equation(s)
       TDELTA, subtracts temperatures like "-" ought to but doesn't
       TINC, adds temperatures like "+" ought to but doesn't
       TVM, shows the financial calculator (Time Value of Money) menu
       TVMBEG, sets payments-at-beginning-of-periods mode
       TVMEND, sets payments-at-end-of-periods mode
       TVMROOT, solves for a TVM variable
       ZFACTOR, calculates gas compressibility factor Z

       Note: The EQ Card's Periodic Table and Tetris game are not in the
          HP 48G/GX, but the EQ Card can be used in the GX if those
          applications are needed. Tetris was not included because no
          agreement on royalty was reached.  The Periodic Table is
          available separately as freeware on HPCVBBS. 

   (7) NEW ARRAY COMMANDS:
   
       COL+, inserts a column vector into a matrix or a number into a
             vector (like INSCOL/PUTCOL in Donnelly's Tool Library)
       COL-, deletes a column from a matrix or number from a vector
             (identical to DELCOL in Donnelly's Tool Library)
       COL->, combines multiple column vectors into a matrix
       ->COL, breaks a matrix into multiple column vectors
              (like repeated GETCOL in Donnelly's Tool Library)
       COND, column norm condition number of a square matrix
       CSWP, swaps two columns in a matrix
             (like EXCOL in Donnelly's Tool Library)
       ->DIAG, returns vector of major diagonal elements of a matrix
       DIAG->, creates matrix with specified diagonal elements
       EGV, eigenvalues and right eigenvectors of a square matrix
       EGVL, eigenvalues of a square matrix
       FFT, discrete Fourier transform
       IFFT, inverse discrete Fourier transform
       LQ, returns the LQ factorization of a matrix
       LSQ, minimum norm least-squares solution to an ill-determined
            system of linear equations
       LU, returns the Crout LU decomposition of a square matrix
       PCOEF, returns polynomial with given roots (inverse of PROOT)
       PEVAL, evaluates polynomial at x
       PROOT, finds all roots of polynomial (inverse of PCOEF)
       QR, returns QR factorization of a matrix
       RANK, rank of a rectangular matrix (uses flag -54)
       RANM, creates matrix with random elements
       RCI, multiplies elements in one row of a matrix by a scalar
       RCIJ, does RCI then adds the result to a row
       ROW+, inserts a row vector into a matrix or a number into a vector
             (like INSROW/PUTROW in Donnelly's Tool Library)
       ROW-, deletes a row from a matrix or number from a vector
             (identical to DELROW in Donnelly's Tool Library)
       ROW->, combines multiple row vectors into a matrix
       ->ROW, breaks a matrix into multiple row vectors
              (like repeated GETROW in Donnelly's Tool Library)
       RSWP, swaps two rows in a matrix
             (identical to EXROW in Donnelly's Tool Library)
       SCHUR, computes the Schur decomposition of a square matrix
       SNRM, spectral norm of an array
       SRAD, spectral radius of a square matrix
       SVD, singular value decomposition of a matrix
       SVL, computes the singular values of a matrix
       TRACE, sum of diagonal elements of a square matrix
   
   (8) GRAPHICS & PLOTTING COMMANDS:
   
       ANIMATE, displays grobs on the stack sequentially.  You can use
                the defaults, or specify your own delay between frames
                (can be *very* fast), the number of times to repeat the
                sequence, and even the pixel coordinates.  It's just like
                a ROLL REPL loop... except very fast.
          Note: Charlie Patton converted 17 seconds of the Apollo
                moon-walk video into HP48 GROBs and ran them with
                ANIMATE, and it looked very good!
       ATICK, specifies tick spacing on plot axes
       EYEPT, specifies the eye-point coordinates in a perspective plot
       GRIDMAP, selects the new "gridmap" plot type
       PARSURFACE, selects the new "parametric surface" plot type
       PCONTOUR, selects the new "pcontour" plot type
       PICTURE, same as GRAPH command
       SLOPEFIELD, selects the new "slopefield" plot type
       WIREFRAME, selects the new "wireframe" plot type
       XVOL, sets the width of the 3D plotting volume
       XXRNG, sets the width of the 3D target mapping range for gridmap
              and parametric surface plots
       YSLICE, selects the new "yslice" plot type
       YVOL, sets the depth of the 3D plotting volume
       YYRNG, sets the depth of the 3D target mapping range for gridmap
              and parametric surface plots
       ZVOL, sets the height of the 3D plotting volume
   
   (9) USER-INTERFACE COMMANDS:
   
       CHOOSE, displays a point-and-click menu "dialog box"
       INFORM, formatted multi-line input with named fields (nice!!)
       MSGBOX, displays text in a centered box with shadow, then WAITs
       NOVAL, placeholder for unspecified values in INFORM argument list
   
   (10) LIST PROCESSING COMMANDS:
   
        ADD, adds lists element-wise (see section #1 above)
        DOLIST, evals an object on multiple lists
        DOSUBS, evals a program or command taking arguments from a list
        ENDSUBS, returns the number of loops the current DOSUBS will do
        HEAD, first element in a list or first char in a string
              (identical to CAR in Donnelly's Tool Library)
        DeltaLIST, list of first finite differences of list objects
        SigmaLIST, sum of the elements in a list
        PiLIST, product of the elements in a list
        NSUB, returns the current list pointer value during a DOSUBS
        REVLIST, reverses the order of the objects in a list
                 (like REVERSE in Donnelly's Tool Library)
        SEQ, list of results from repeated execution of an object
             (like a FOR/STEP loop but the results go into a list)
        SORT, sorts elements in a list into ascending order, or sorts a
              list of lists using each list's first element as the key
              (can be done with LSORT/QSORT in Donnelly's Tool Library)
        STREAM, executes an object on first two elements of a list, then
                again on the result and the 3rd element, etc.  Allows
                easy creation of things similar to SigmaLIST and PiList.
        TAIL, returns a decapitated list or string (see HEAD above)
              (identical to CDR in Donnelly's Tool Library)
       
   (11) SYSTEM COMMANDS:
  
        CLTEACH, clears the 'EXAMPLES' directory created by TEACH
        CYLIN, sets polar/cylindrical coordinate mode
        FREE1, like 1 FREE (see section #2 above)
        MERGE1, like 1 MERGE (see section #2 above)
        PINIT, port initialize, esp. important for 4-Meg RAM card users
        RECT, sets rectangular coordinate mode
        SPHERE, sets polar/spherical coordinate mode
        TEACH, loads the Owner's Manual examples into a dir in HOME
        VERSION, returns the operating system ROM version string and a
            copyright notice, like this:
            2: "Version HP48-R"      <-- means version "R"
            1: "Copyright HP 1993" 
            Note: See FAQ answer 2.4 for details about the versions.
        XRECV, Xmodem protocol receive (binary mode only)
        XSEND, Xmodem protocol send (binary mode only)
   
   (12) MATH COMMANDS:
   
        LININ, tests whether an equation is linear in a given variable
        NDIST, normal probability density
        PCOV, population covariance of SigmaDAT
        PSDEV, population standard deviation of SigmaDAT
        PVAR, population variance of SigmaDAT
        RKF, solves initial value problem using Runge-Kutta-Fehlberg
        RKFERR, change in solution and absolute error using RKF
        RKFSTEP, next solution step with given error tolerance using RKF
        RRK, solves initial value problem using Rosenbrock & RKF
        RRKSTEP, next solution step with given error tolerance using RRK
        RSBERR, change in solution and absolute error using Rosenbrock
   
   (13) MENU NUMBERS & KEY CODES.
   
        Many menu numbers have changed, so software that uses # MENU or #
        TMENU may not work the same as in the HP 48S/SX. (Specifically,
        only menu numbers 0-3, 28, 30, and 42-59 are the same). Likewise,
        almost all of the shifted keycodes correspond to new commands and
        menus, which programmers must take into account; for example, the
        "RAD" key on the S/SX had the keycode 82.2, but it's 21.2 on the
        G/GX.  The left-shift key, which was orange on the S/SX, is now
        purple [officially "lavender"], and the right-shift key which was
        blue on the S/SX is now green [officially "teal"] on the G/GX.
        Also, the digit-key menus can be activated by both shift keys;
        left-shift gives the softkey menus like in the S/SX, but the
        right-shift gives the new user-friendly full-screen menus.
        The unshifted keys remain identical to the S/SX, except for a
        cosmetic color change to match the very dark green of the
        calculator case.

   (14) MANUALS

        The G/GX comes with two manuals, a "Quick Start Guide" for
        beginners, and a cost-cutting, slimmer owner's manual called the
        "User's Guide" which has only 21 pages about programming, since HP
        figures that the huge majority of all 48 owners never program it
        anyway.  The power users can buy the optional "Advanced Users
        Reference Manual" (similar to the S/SX's "Programmer's Reference
        Manual") which covers programming and the many commands that are
        not mentioned in the User's Guide.  There is no "Quick Reference
        Guide" like the S/SX came with, although the case still has a
        pocket for one.  Jim Donnelly has marketed a nice pocket guide,
        but it's too wide to fit in the case's pocket.  The User's Guide
        is not spiral bound, but is made to open fully and last a long
        time, since it's not just glued but has sewn signatures like real
        books, and is printed on quality paper. 

   (15) FLAGS

        Some previously "unused" flags are now used.  They are: 

        -14 Clear = end-of-period payment mode (for TVM calculations)
            Set   = beginning-of-period payment mode
    
        -27 Clear = display symbolic complex numbers in coordinate form
                    e.g. '(X,Y)'
            Set   = display symbolic complex numbers using 'i'
                    e.g. 'X+Y*i'
    
        -28 Clear = plot multiple equations like the S/SX does (serially)
            Set   = plot multiple equations simultaneously
    
        -29 Clear = include axes in plots (like the S/SX does)
            Set   = omit axes from 2D and statistics plots
    
        -30 is no longer used (it never did anything useful anyhow)
    
        -54 Clear = tiny matrix elements get rounded to zero
            Set   = leaves matrix elements alone
    
        The default setting of all these flags is Clear (as in the S/SX).
    
   (16) FLAG BROWSER 

        There is a System Flag browser which shows the flag number, shows
        whether it's set or clear, lets you toggle it, and shows in 
        English what the current setting means.

   (17) CHARACTER BROWSER

        While programming, if you want to type any character at all, press
        CHARS and a screenful of ASCII characters is displayed that you
        can browse with the arrow keys, and not only does the screen also
        show the ASCII code (NUM value) and even the shortcut keyboard key
        sequence (if any) for each character, but if you press ECHO, it'll
        be "typed" into your program.  There's no need any more for the
        alpha keyboard table.

   (18) DIRECTORY MAINTENANCE

        Press right-shift VAR to launch a Variable Browser which is a
        complete memory manager.  You can tag multiple objects and copy,
        move, or delete them all with a single keystroke; there's even a
        Mark All and an Unmark All, like a real computer.  It's slow,
        however, and has been obsoleted by the very fast PCT library.

   (19) FRACTIONAL UNIT POWERS

        The S/SX only handled integer powers of units correctly, but the
        G/GX can use any real number as a unit power.

   (20) NAME PLATE 

        The case has a rectangular indentation in the back like the HP
        95LX and 100LX, and it comes with an adhesive metal nameplate that
        you can get engraved with your name.  ($5 at EduCALC if ordered at
        time of purchase).

   (21) XLIB NAMES

        All of the new commands in the GX are XLIB names, and therefore
        take 5.5 bytes in programs.  The commands common to the SX and GX
        take 2.5 bytes each, as they did in the SX.

   (22) INPUT FORMS and CHOOSE BOXES

        Many operations have two menu types: the old SX style, and a new
        "drop-down" menu and "input forms" that have the feel of computer
        dialog boxes.  Especially useful for the HP48 beginner.

   (23) ENHANCED PRECISION
        
        The internal precision of at least some of the matrix routines has
        been improved; INV gets better answers on square matrices than the
        SX did.  HP has not released information about which routines were
        improved, how, and by how much.

   (24) IMPROVED DISPLAY 

        The LCD introduced with revision M of the G/GX is easier to read
        since it has higher contrast between on/off pixels.  It has a
        slower cycle response time, however, making it difficult to use
        for rapid-motion video games or any other rapid animation. 

*******************************************************************

* Appendix D: The EquationWriter Bug & Rev J Bugfix

  [ The following was taken from a posting by Joe Horn.  ]

    Rev A-E EquationWriter Bug & Rev J Bugfix
                -----------------------------------------
                           observed by Joe Horn

                           +------------------+
                           |  Rev E behavior  |
                           +------------------+

  Clear flag -53 first (the Precedence Flag).

  On a Rev E, put '((1+2)/(3+4))^5' on the stack and press down-arrow.
  You'll see:
                             5
                      / 1+2 \
                      | --- |                         (A)
                      \ 3+4 /

  which is as it should be.  But now press [orange-shift] [+]; see the
  message "Implicit () off" momentarily; press [left-arrow] (not
  backspace), then press the [EXIT] softkey.  The expression gets
  mangled into this:

                        1+2
                    -----------                       (B)
                          (5)
                     (3+4)

  which is not equal to expression (A) above!  Bug, yes?  Press [ON] to
  abort the process.

  Now set flag -53, then repeat the above procedure.  First you see:

                             5
                      / 1+2 \
                      | --- |                         (C)
                      \ 3+4 /

  which is the same as (A) above; but continuing as before, you see:

                               (5)
                      /  1+2  \
                      | ----- |                       (D)
                      \ (3+4) /

  which *is* equal to the original.  Thus the bug can be worked around
  by keeping flag -53 set (not a pleasant solution).

                           +------------------+
                           |  Rev J behavior  |
                           +------------------+

  Major difference: after pressing down-arrow, Rev J goes directly into
  graphic mode, so you have to press ON and then EXIT to get into the
  equation editor (which Rev E goes directly into).  But that's petty
  cash compared to the following big change.

  The same sequence of operations, first with flag -53 clear, then set,
  exactly as detailed above, yields these four displays in a Rev J:

                               5
                      / (1+2) \
                      | ----- |                       (A')
                      \  3+4  /

  (notice the extra parentheses?) and then:

                               5
                      / (1+2) \
                      | ----- |                       (B')
                      \ (3+4) /

  which *is* equal to (A'); nothing at all like expression (B) above!
  and then:

                               5
                      / (1+2) \
                      | ----- |                       (C')
                      \  3+4  /

  which is the same as (A') above; and then:

                               5
                      / (1+2) \
                      | ----- |                       (D')
                      \ (3+4) /

  which is also equal to (A').  No bug in Rev J.

  SUMMARY: Rev A-E have a bug in the EquationWriter that can mangle
  expressions if flag -53 is clear (the default) and if "Explicit
  Parentheses" mode is toggled.  This bug has been fixed in Rev J.

  Unfortunately (as you can see above) Rev J *always* puts parentheses
  around polynomial numerators.  It is therefore impossible to use the
  ->GROB command on a Rev J to create a GROB that looks like expression
  (A) above; the simplest that can be had is expression (A').

  Another minor change, while I'm at it: Rev A-E don't change the menu
  when you press REPL; Rev J automatically flips to the appropriate
  RULES menu.

  None of these changes are documented anyplace that I'm aware of.

  Please post any corrections & additions you find.  Thanx.

  -Joseph K. Horn-   -Peripheral Vision, Ltd.-
  akcs.joehorn@hpcvbbs.cv.hp.com
  Disclaimer: I don't work for HP, EduCALC, or anybody else.

******************************************************************

* Appendix E: Compact Data Storage:

  From Jim Donnelly (jimd@cv.hp.com):

        A simple length-encoding technique can be put to use for a
        free-format, very compact multi-field data storage system.
        Two tiny programs, SUBNUM and STRCON are here to help the
        process, and are listed near the end of this note.  At the
        end of the note is a directory that may be downloaded into
        the HP 48 that contains the examples.

        The principle is to store starting indices in the beginning
        of a string that point to fields stored subsequently in the
        string.  The indices are stored in field order, with an
        additional index at the end to accommodate the last field.
        There are several small points worth mentioning:

        1) Fields may be 0-length using this technique.
        2) The execution time is uniform across all fields.
        3) This technique saves about 4 bytes per field after
           the first field, because the string prolog and length
           are omitted for fields 2 -> n.


        EXAMPLE:
        --------

                         Indices  |          Fields
          Character               |     1 11111111 12222222222
          Position :   1  2  3  4 |567890 12345678 90123456789
                      +--+--+--+--+------+--------+-----------+
          String :    | 5|11|19|30|Field1| Field2 |  Field 3  |
                      +--+--+--+--+------+--------+-----------+

        This is a string that contains 3 fields, and therefore 4
        index entries.  The first field begins at character 5, the
        second field begins at character 11, and the third field
        begins at character 19. To keep the pattern consistent,
        notice that the index for field 4 is 30, which is one more
        than the length of the 29 character data string.

        To extract the second field, place the string on the stack,
        use SUBNUM on character 2 to extract the starting position,
        use SUBNUM on character 3 to extract the (ending position +1),
        subtract 1 from the (ending position+1), then do a SUB to
        get the field data.  NOTE: The index for field 1 is stored
        as character code 5, NOT "5"!  To place the field index for
        field 1 in the string, you would execute "data" 1 5 CHR REPL.


        PROGRAM:
        --------

        The following program accepts an encoded data string in
        level 2 and a field number in level 1:

        DECODE   "data"  field#  -->  "field"

        <<  --> f
          <<
            DUP f SUBNUM                ; "data" start -->
            OVER f 1 + SUBNUM           ; "data" start end+1 -->
            1 -                         ; "data" start end -->
            SUB                         ; "field" -->
          >>
        >>


        DATA ENCODING
        -------------

        The following program expects a series of 'n' strings on
        the stack and encodes them into a data string suitable
        for reading by the first example above.

        The programs SUBNUM and STRCON are used to assemble the
        indices.

        ENCODE      field n  ...  field 1   n   -->  "data"

        << DUP 2 + DUP 1 - STRCON --> n  data
          <<
            1 n
            FOR i
              data i SUBNUM OVER SIZE   ; ... field index fieldsize
              + data SWAP               ; ... field "data" index'
              i 1 + i + SWAP CHR REPL   ; ... field "data"'
              SWAP + 'data' STO         ; ...
            NEXT
            data                        ; "data"
          >>
        >>

        In this example, four strings are encoded:

        Input:  5: "String"
                4: "Str"
                3: "STR"
                2: "STRING"
                1:         4

        Output: "xxxxxSTRINGSTRStrString"      (23 character string)
        (The first five characters have codes 6, 12, 15, 18, and 24)



        VARIATION:
        ----------

        The technique above has a practical limit of storing
        up to 254 characters of data in a string.  To overcome
        this, just allocate two bytes for each field position.
        The code to extract the starting index for becomes a
        little more busy.  In this case, the index is stored as
        two characters in hex.

                      Indices  |          Fields
       Character               | 11111 11111222 22222223333
       Position :   12 34 56 78|901234 56789012 34567890123
                   +--+--+--+--+------+--------+-----------+
       String :    |09|0F|17|21|Field1| Field2 |  Field 3  |
                   +--+--+--+--+------+--------+-----------+

           <<  --> f
             <<
                DUP f 2 * 1 -           ; "data" "data" indx1 -->
                SUBNUM 16 *             ; "data" 16*start_left_byte  -->
                OVER f 2 * SUBNUM +     ; "data" start
                OVER f 2 * 1 + SUBNUM   ; "data" start end_left_byte -->
                16 * 3PICK f 1 + 2 *
                SUBNUM + 1 -            ; "data" start end -->
                SUB                     ; "field"  -->
             >>
           >>



        TWO VERY TINY HELPFUL PROGRAMS
        ------------------------------

        SUBNUM          "string"  position  -->  code

        << DUP SUB NUM >>



        STRCON          code  count  -->  "repeated string"

        << -->  code count
          << "" code CHR 'code' STO
             1 count START code + NEXT
          >>
        >>


        A DIRECTORY YOU CAN DOWNLOAD
        ----------------------------

        This is a directory object.  Cut after the === to the end of
        the file and download to your HP 48 using the ASCII transfer.

========================================================================
%%HP: T(3)A(D)F(.);
DIR
  DECODE
    \<< \-> f
      \<< DUP f
SUBNUM OVER f 1 +
SUBNUM 1 - SUB
      \>>
    \>>
  ENCODE
    \<< DUP 2 + DUP 1
- STRCON \-> n data
      \<< 1 n
        FOR i data
i SUBNUM OVER SIZE
+ data SWAP i 1 +
SWAP CHR REPL SWAP
+ 'data' STO
        NEXT data
      \>>
    \>>
  STRCON
    \<< \-> code count
      \<< "" code CHR
'code' STO 1 count
        START code
+
        NEXT
      \>>
    \>>
  SUBNUM
    \<< DUP SUB NUM
    \>>
END

******************************************************************

* Appendix F: Various useful functions



Begin OBJFIX.DOC
-----------------------------------------------------------------------
OBJFIX by HP for SX and GX

When a binary object received by Kermit on the HP-48 is
left as a string beginning with HPHP48, OBJFIX will
extract the HP-48 object if the only problem is that
extra bytes got appended to the end.

OBJFIX takes a variable name in stack level 1 and
modifies the contents of the variable if no other
problems are detected.

[Note: This is like FIXIT by Horn & Heiskanen on Goodies
 Disk #8, but this one is by HP and so I suppose it's
 more reliable. Although it fails the test cases
 included with FIXIT, that may be because they were
 artifically contrived cases. Try both on real-world
 downloads that need fixing. Which do you like better?
 -jkh-]

-----------------------------------------------------------------------
End OBJFIX.DOC

--------Cut-Between-the-Lines:-Begin-OBJFIX.ASC-----------------------
%%HP: T(3)A(D)F(.);
"D9D202BA81D9F81B2040D9D20F2A26DA91629C8145126489162C23072C80CCD2
0BD0008FB9760147108134164142C2818F24D534501008B2F41643150D73B840
58405438314A161966D2BF6BF6A6F5BE16314213114334CF8208A6F58F235A04
55136D7D4EA494D231A1CA101110131CA130DBE284F8FC0760D41198F29960D4
130142119EA1408F5E0108D341503223072D70B2130B21301460"
--------Cut-Between-the-Lines:-End-OBJFIX.ASC-------------------------
         
Begin FIXIT.DOC
-----------------------------------------------------------------------
(Comp.sources.hp48)
Item: 139 by akcs.joehorn@hpcvbbs.cv.hp.com [Joseph K. Horn]
                        and mheiskan@hut.fi [Mika Heiskanen]
Subj: Fixit v3.2, repairs bad downloads
Date: 14 Jul 1992

PURPOSE:
-------
Converts a badly uploaded string into the original object.

THEORY:
------
A lot of folks upload HP 48 objects poorly, such that when you
download them, you just get strings full of garbage that look
something like this:

    "HPHP48-E#c&r$a%p@!*!..."     [looks familiar, eh?]

That's because they uploaded it using XMODEM, or managed to screw it
up some other way.  The following FIXIT program takes such a string
and extracts the actual HP 48 object that they originally intended to
upload (if at all possible).

Such object extraction can be done by hand, but it's too dangerous.
FIXIT minimizes the danger of Memory Clear.  It checks whether the
extracted object is a valid one, and if not, drops it from the stack
before the HP 48 attempts to display it.  All of the many bad
downloads I've archived over the years are fixed by FIXIT, whereas
about half of them cause a Memory Clear when extracted manually. No
guarantees, however.  Use at your own risk.

The actual extraction is done by a "Code object" written by Mika
Heiskanen.  The User RPL "shell" around this code object is what
minimizes the danger of Memory Clear; it was written by Joe Horn.

INSTRUCTIONS:
------------
BACKUP YOUR MEMORY, just in case the string contains a logic bomb.

Place the bad download on the stack (see "HPHP48-...") and run FIXIT.

Possible results:

(1) No error: the object was extracted successfully and is on level 1.

(2) "Bad Argument Type" error: you didn't have a string on level 1.

(3) "Bad Argument Value" error: the string wasn't of the proper form;
    it must be an "HPHP48-..." downloaded string.

(4) "Invalid Definition" error: the object was mangled in transmission
    so badly that its end was lost; the object cannot be extracted.

(5) "Undefined Result" error: there is no HP 48 object in the string.

(6) "Recover Memory? YES/NO": the string contained a bomb, and FIXIT
    detonated it.  Press YES to sift through the shrapnel and rubble
    in a feeble attempt to resurrect the dead.  Press NO to bury them.

EXAMPLES:
--------
To do the following examples, download the FIXIT directory to your HP 48
and get into it.

(1) Press HI.  See "HPHP48-E%$@#%@...", a badly uploaded download.
    Before pressing FIXIT to fix it, try doing what we all used to do:
    press EDIT to see if we can recognize anything (usually a futile
    attempt).  We see:

    "HPHP48-E%@$#%$@...
    << Melancholy Baby >>"

    But looks can be deceiving; press ON to exit the editor, and then
    press FIXIT to extract the intended upload:

    << Happy Camper >>

(2) Press WTAV; see another garbage download.  But EDIT refuses; the
    string contains nulls.  Press FIXIT; see successfully extracted
    directory.

(3) Press BAD1.  Notice that it looks exactly like WTAV.  (Press WTAV,
    compare, then DROP).  But its ending is all messed up; manually
    extracting WTAV from BAD1 can cause Memory Clear.  Press FIXIT and
    see "Error: Invalid Definition" indicating that the object inside
    BAD1 is so mangled that its end cannot be located.

(4) Press BAD2.  Looks like WTAV again.  But its body is messed up;
    manually extracting it would create an External object that could
    cause Memory Clear if evaluated.  Press FIXIT and see "Error:
    Undefined Result" indicating that there is nothing recognizable
    inside BAD2.


-----------------------------------------------------------------------
End FIXIT.DOC

--------Cut-Between-the-Lines:-Begin-FIXIT.ASC------------------------
%%HP: T(3)A(D)F(.);
"69A20FF7CE20000000402414442340C2A203B000840584054383D25403A20FF7
2500000000403535947440D9D20E16329C2A2DBBF13013216DF1406A1C42328D
BF193632B213034000407545146540D9D20E163292CF1EFFB1DBBF1EBFB150FA
193632B2130003030303034C000402414441340C2A203B000840584054383D25
469A20FF72500000000403535947440D9D20E16329C2A2DBBF13013216DF1406
A1C42328DBF193632B213034000407545146540D9D20E163292CF1EFFB1DBBF1
EBFB150FA193632B2131313131313134C000407545146540C2A203B000840584
054383D25469A20FF72500000000403535947440D9D20E16329C2A2DBBF13013
216DF1406A1C42328DBF193632B213034000407545146540D9D20E163292CF1E
FFB1DBBF1EBFB150FA193632B2130003030303034C00020849420C2A20570008
40584054383D254D9D20E163284E2050841607079784E20603416D6075627936
32B2130A0BA02D456C616E63686F6C697022416269702BB28000506494859445
50D9D20E16323CE2278BF168BC1ED2A2167E1AFE22D9D203CE2278BF19C2A274
3A2C58C1C2A2031000840584054383D2167E1AFE22D9D2078BF18B9C1DBBF1AA
F028DBF1CCD201200014713717917F137145142164808C5BF22D9D2033920200
0000000005150933A1B21305DF22B21305BF22D9D20339202000000000004150
933A1B21305DF223CE2278BF168BC1D8DC1167E1AFE22D9D203FBF1339202000
000000002770933A1B21305DF223CE2278BF19D1A1DBBF18DBF1E0CF1D5CE1AF
E22D9D208DBF1339202000000000000030933A1B21305DF22CB2A193632B2130
B21303D4F"
--------Cut-Between-the-Lines:-End-FIXIT.ASC--------------------------

*******************************************************************

     (Shamelessly lifted from the HP-41C manual:)

     The LASTX function is useful in calculations where a number occurs
     more than once.  By recovering a number using LASTX, you do not
     have to key that number into the calculator again.

     For example, calculate:

                96.704 + 52.394706
               --------------------
                     52.394706

        Keystrokes:                     Stack:
       ------------------              --------------------
        96.704 ENTER                    96.704

        52.304706 +                     149.098706

        LASTX                           149.098706
                                        52.304706

        /                               2.84568265351

@
@ This is a version of LASTX for the HP 48
@
%%HP: T(3)A(D)F(.);
\<< DEPTH \-> n
  \<< LASTARG DEPTH n
- DUP \-> s
    \<< ROLLD s 1 -
DROPN
    \>>
  \>>
\>>
******************************************************************

* Appendix G:   Rotation rate to angular frequency conversion bug

[Editor's Note: A counter point to this bug report is provided at
the end appendix]

By: Wlodek Mier-Jedrzejowicz
    wlodek@ic.ac.uk (or if that fails, try wacm@doc.ic.ac.uk)
    Posted to comp.sys.hp48 on April 29, 1994

----BEGIN QUOTED MATERIAL-----------

      ROTATION RATE TO ANGULAR FREQUENCY CONVERSION BUG
    
There is a rotation rate conversion bug in the HP48G/GX which I have 
not seen reported here before, so after discussion with the folks at 
Corvallis I am posting this description. Warning: it is 159 lines long!

First - an example. Put the unit object 60_rpm in level 2 and the unit 
object 1_r/s in level 1, then execute the command CONVERT. You are 
asking the HP48 to convert a rotation rate of 60 revolutions per minute 
into an angular frequency in radians per second. 60 rpm is 1 revolution 
per second, or 2pi radians per second. No HP48G/GX will give this answer! 
Not everyone uses rpm or is even aware of the existence of this unit - 
it is one of the extra units in the UTILS menu of the Equation Library - 
so here is a second example - add 2pi radians per second to one Hertz. 
Put 6.2832_r/s in level 1, 1_Hz in level 1, and add. You are adding an 
angular frequency of two pi (one cycle) per second to a rotation rate 
of one per second, so the result should be a frequency of two Hertz. On 
an HP48S/SX that is the answer. On an HP48G/GX it is not.

When units are converted, by CONVERT, or during arithmetic on unit 
objects, the level 2 object is first turned into "base units", and then 
the result is converted into the units of the level 1 object. On the 
HP48S/SX, the "base unit" of angles is one rotation (or a "unit circle" 
or a revolution or a cycle). So, the angle unit of rpm (a revolution) 
or of Hz (a cycle if Hz is treated as a rotation rate) is already in 
base units - conversions to angles involving rpm and Hz automatically 
work correctly. On the HP48G/GX, the "base unit" of angles is the 
current angle mode (DEG, RAD or GRAD) - so any conversion from rpm or 
Hz (or any formula which works in cycles, rotations, revolutions, unit 
circles) to angles should be preceded by a conversion from the unit 
circle to the current angle. Apparently no-one noticed this would be 
necessary, because it all worked automatically on the HP48S/SX.

So, when you convert 60_rpm to units of _r/s, an HP48G/GX converts not 
60 rotations but 60 "base angle units" per minute to radians/second. In 
RAD mode, you get 1 radian per second. In DEG mode you get 1 degree per 
second, and in GRAD mode you get 1 grad per second (in each case 
expressed in radians). That's three different answers, none of which is 
correct! Exactly the same happens if you convert 1_Hz to angles per 
second, and the inverse mistake is made if you convert angles per time 
to cycles or rotations divided by time.

I first learned of this bug from a member of HPCC (the British club for 
users of HP handhelds), Peter Embrey. He describes his troubles in 
articles in the first two 1994 issues of our club journal, DATAFILE (in 
Volume 13 number 1 pages 12 to 14 and V13n2p6). He was calculating the 
energy stored by a flywheel - given by the formula (1/2)*I*omega^2 and 
after a time he decided the answers had to be much too big when he 
CONVERTed from kg*m^2*(r/s)^2 to W*h on an HP48GX. It turns out that 
(r/s) are the correct units to get the right answer, but the GX was 
converting to degrees per second as it was in DEG mode, so his answer 
was too large by a factor of (360/2pi)^2 - a factor of about 3,300. In 
this case, his HP48SX was not much better, since it converted from 
radians to unit circles. The way to get the correct answer is to use an 
HP48G or GX in RAD mode - or to divide out the radians from the formula 
before using CONVERT. This is not yet a bug, but needs as much care as 
does use of temperature units on the HP48. But when Peter tried to deal 
with the problem by working in rpm, he came upon the bug described 
above. My thanks to Peter for putting me on the trail!

Apparently this bug not been reported before - at least my friends in 
HP tell me that it was not on their list of known problems until I told 
them of it. (This means it is not fixed in the new revision R.) Why not 
- does everyone know about it and work around it without thinking to 
tell anyone else? Or does no-one use their HP48 to do calculations on 
rotating bodies - or do most people do calculations with rotating 
bodies in such a way that they do not encounter this problem? Could 
there be hundreds of students and engineers out there calculating and 
designing things on their HP48G/GX and getting wildly inaccurate 
results? Has anyone built a disk drive or a jet engine which rotates 
far too fast and will disintegrate because of this? No, of course not, 
all engineers know that any design calculation absolutely must be 
repeated on two entirely separate calculators or computer programs! :-| 
Maybe some students have lost marks in exams because of this though - 
but please, this is not intended to restart the discussion as to 
whether calculators should be allowed in exams! 

I want to underline again that apparently no-one has reported this 
before - which must mean that few people have been affected by it. It 
is therefore not a good reason to throw away your HP48G/GX or get on a 
high horse and demand that HP replace your HP48G/GX - but I think it is 
important that people be warned so they can take appropriate avoiding 
action. The rest of this message goes into more detail - if you never 
worry about rotation calculations then you can safely ignore the rest - 
though you might find it interesting, so don't stop yet :-)

One way to avoid this would be to add a new unit to the HP48 - call it 
what you like - the "cycle" or "rotation" or "revolution" or "unit 
circle". As I wrote above, this is already implied in the HP48S/SX; to 
see this on an HP48S/SX, put 360 degrees in level 1 and execute UBASE - 
the result is 1, meaning that 360 degrees are equivalent to one base 
unit of angle measurement, but that there is no named HP48 unit 
corresponding to this. In contrast, UBASE on an HP48G/GX considers the 
base unit of angle measurement to be the radian, even though CONVERT 
behaves as though the base unit is the current angle mode. There appear 
to be two different norms for base angle units on the HP48G/GX!

The whole subject gets very little mention in HP's manuals. In the 
original HP48SX manual (two volumes, spiral bound), the section on 
"Dimensionless Units of Angle" in chapter 13, on page 198, warns the 
reader about the danger of using dimensionless units and states how 
angle units and scalars are treated. In the later HP48S and HP48SX 
manual (one volume), the same warning is given in "Converting 
Dimensionless Units of Angle", on page 13-12. The HP48G Series User's 
Manual, in "Converting Angular Units" on page 10-7, says that 
conversion will interpret a scalar according to the current angle 
mode setting. (A scalar is a pure number with no units.)

For a detailed description, look in the HP48S/SX edition of "HP48 
Insights Vol II", section 21.4.3. This book is written by Dr Bill 
Wickes, who was the design team leader of the HP48SX, and who wrote 
the "Insights" books largely to provide the sort of explanations and 
details that get left out of manuals. A good explanation of angle units 
is exactly the sort of thing one can find there! He explains the 
pitfalls and unavoidable contradictions of working with angles in the 
HP48 units system and points out that the HP48S/SX make the somewhat 
arbitrary choice of using 2pi as the base unit of angles, thereby 
making conversions between angles per time and Hertz work correctly.

Maybe no-one on the HP48G/GX team read this while they were making 
changes from the HP48S/SX! Why did they change the base unit at all? 
Most likely they were trying to deal with another contradiction: the 
units system lets you add pure numbers to angles, since both are 
dimensionless. If you add the number 1 in level 2 to the unit object 
0_r in level 1 on an HP48S/SX, the number 1 is treated as 1 base unit, 
or 2pi radians, and the result is 6.2832_r - but if you take the SIN of 
the number 1 instead, it is not treated as 2pi, but as 1 unit of the 
current angle mode. The change made on the HP48G/GX does resolve this 
contradiction, but at the cost of introducing the bug described above.

As mentioned, a way to resolve the problems involved would be to add 
the angle unit "cycle" explicitly to the HP48 units system. Hz would 
then be treated as cycles per second when used in calculations 
involving rotations - rpm would be treated as cycles per minute, and 
conversions would go from cycles to the appropriate angle units. This 
suggestion was made by Peter Embrey in his articles, and the folks at 
HP accept that this is a good solution - but they have not implemented 
it yet. In the meantime, be very, very careful when converting between 
units of rotation rate and units of angular frequency. I would urge 
everyone who does not yet have a copy of Insights II to buy one and 
read the relevant section - maybe that will even entice Bill Wickes 
into publishing his long-awaited HP48G/GX version of the book!

I have not yet mentioned solid angles. In principle there should be no 
problem - on both the HP48S/SX and the HP48G/GX the base unit of solid 
angle is a "unit sphere", or 4pi steradians. On the HP48S/SX you can 
add the pure number 1 to 0_sr and get 12.5664_sr (4pi steradians). The 
HP48G/GX manuals imply that exactly the same should happen, but on my 
(version L) HP48GX this gives the error message "Inconsistent Units". 
This is yet another undocumented difference between the Series S and 
Series G but at least it is no bug!

Apologies for making this description so long, I hope most people will 
agree that a subject like this deserves a careful description! For my 
next trick - some details on the HP48 Random Number Generator.

----END QUOTED MATERIAL-----------

Additional insight from Eric Haas (ERICHAAS@delphi.com)

"The angular conversion bug is actually in the definition
of the rpm unit. If you put 1_rpm on the stack, and type
UBASE,  you get 1.66666666667E-2_1/s.  Notice that there
is no angular unit in the definition. If the rpm unit is
instead  defined  as 6_=F8/s, all  conversions to and from
rpms will work just fine. As an easy work-around, define
the  unit  RPM  as  6_=F8/s and  use  that  instead of the
built-in unit.

If  desired, one could also define the unit HZ as 60_rpm
or 360_=F8/s. However, as Hz is sometimes used to describe
things  other  than  rotation  rates,  such a definition
would not be appropriate for all circumstances."

******************************************************************

* Appendix H: How to make a Serial Cable for your HP48

>From: prompt@xs4all.nl (Frank A. Vorstenbosch)

HOW TO MAKE A SERIAL CABLE FOR YOUR HP48
========================================

THE CONNECTOR FOR YOUR HP48

   The connector used in your HP48 is a 4 pin (i.e. male) connector, 
   with pins spaced 2 mm (NOT 0.1") apart.  These connectors are not 
   readily available in stores so you'll have to improvise.  If you 
   happen to have a broken floppy drive or harddisk lying around,
   look inside and see if you can find a connector there that will fit
   the HP48.  Do not use a 0.1" connector, as this will damage the 
   pins in your calculator.

   If you can't find a usable connector, then you'll have to make one
   yourself.  For this you need four pins taken from a wire-wrap IC
   socket (available from Radio Shack or some other shop catering for
   DIY electronics).  The smallest IC socket available usually has 8
   pins; so don't worry if you damage a pin while removing it from the
   hard plastic socket.  The pins of the wire-wrap socket are about
   1" long, thereby making soldering them easier than standard sockets.

   Next, solder a 'fork' from thin rigid metal wires, to hold the four
   IC pins spaced at exactly 2 mm while you glue them together with
   superglue.  Glue a plastic 'handle' to the four IC pins to be able
   to remove the connector from the HP48.  You can also indicate the 
   top side of the connector on this handle.

   Note that the hole in the HP48 in which the connector should go
   is not symmetrical; the pins are nearer to the top of the calculator
   than the bottom, and you can use this to make it difficult to insert
   the connector the wrong way up.

      Connector to plug                          
      in your HP48 (F)    HP48 connector (M)     
      
           ______               ______
           |oooo|               |....|           
           \____/               \____/           
       pin 4   pin 1        pin 1    pin 4


MAKING THE CONNECTIONS

   You can use either a 9 or a 25 pin female sub-D socket for the
   PC-side of the cable.
      
         9-pin RS232                 25-pin RS232
        connector (F)                connector (F)
      
      pin 5       pin 1    pin 13                     pin 1
        -------------         ---------------------------
        | o o o o o |         | o o o o o o o o o o o o |
         \ o o o o /           \ o o o o o o o o o o o /
          ---------             -----------------------
       pin 9     pin 6      pin 25                   pin 14
      
   Use flexible 4-wire cable to connect the four contacts of your HP48
   connector to the PC connector.  Pin 1 of the HP48 should be 
   connected to the metal shield of the RS232 connector.  Usually it
   is not easy to solder this shield; first scratching the shield bare
   (it has some kind of coating) using a screwdriver or a file will 
   help.  If this doesn't work, simply leave pin 1 of the HP48 
   disconnected.  Note that pins 2 and 3 of the RS232 connector must
   be swapped when you use a 25-pin connector.

      HP to PC cable            
      
      HP48 | RS232-9 | RS232-25 
      -----+---------+----------
        1  | shield  |  shield  
        2  |    2    |    3     
        3  |    3    |    2     
        4  |    5    |    7     

   Before connecting the completed cable to your HP48, check for
   short-circuits using an ohmmeter or multimeter set to ohms or 
   "diode test".


HP TO HP CABLE

   If you want to use 9600 bps communication between two HP48s, then
   make two HP48 connectors and simply connect the two, swapping pins
   two and three.

      HP to HP cable

      HP#1 | HP#2
      -----+-----
        1  |  1
        2  |  3
        3  |  2
        4  |  4


WARRANTY, DISCLAIMER ETC.

   Although the serial interface of the HP48 is protected internally,
   it is possible to damage the calculator when a wrong connection is
   made.  I am not responsible for any errors in this file, or for any
   mistakes you may make.
 


******************************************************************
END PART 3 OF 4  






--
madd0118@nova.gmi.edu            ------><------            Keith D. Maddock
"Of course I'm crazy, but that doesn't mean I'm wrong. I'm mad but not ill"
Freightliner Corp, Portland, Oregon/GMI Engineering & Mgt Inst: So2,ME-Auto
comp.sys.hp48 FAQ Maintainer (GX-R), Eagle Scout, Delta Tau Delta EI-B, :-)



From madd0118@gmi.edu (Keith Maddock)
Date: 10 March 1995 22:25:42 GMT

Archive-name: hp/hp48-faq/part4
Last-modified: 12/12/1994
Version: 3.01
Posting-Freqency: every 14 days or so

        *********************************************************
             HP 48 S/SX/G/GX  Frequently Asked Questions List
        *********************************************************
   PART 4 of 4: Appendix I: HP48 "BEST PROGRAMS AND WHERE TO GET THEM" LIST

           Maintained by Keith Maddock (madd0118@nova.gmi.edu)

  ********************************************************************** 
             HP48 "BEST PROGRAMS AND WHERE TO GET THEM" LIST
  **********************************************************************

        This list is designed to help HP48 users locate useful, well 
        written programs for their HP48, selected by HP48 users who send 
        in recommendations for their favorite programs.  
 
        Many HP48 programs can be found on the following FTP sites:  

        wuarchive.wustl.edu  :  /systems/hp/hp48
       *cbs.cis.com          :  /pub/hp48g  
        hpcvbbs.cv.hp.com    :  /pub

       *( All programs in the main file areas (excluding uploads, 
          unprocessed directories) at cbs.cis.com are GX compatible.  
          The index file at cbs.cis.com is very well maintained and has 
          excellent program descriptions. ) 

         CompuServe has a modest HP 48 archive in the HP handhelds forum.
         Type "go HPSYSTEMS" to access the forum.  HP 48-specific files can 
         be found in DL 4 

                               Appendices:
         1)        Other HP48 FTP Sites
         2)        FTP by Mail
         3)        HP48 BBS's
         4)        Goodies Disks

        The entries in the list generally follow this format:

PROGRAM                 AUTHOR 
SUMMARY
COMPATIBLE              APPROX SIZE
LOCATION
        
        Compatibility is noted by either SX (SX only), GX (GX only),
SX/GX (SX and GX), or SX/GX? (Works on SX, not sure about GX).  If you 
try a SX/GX? program on a GX, let me know if it works/doesn't so I can 
change it on the list! 

        If you want to recommend a program that is not on this list, send 
email to: "madd0118@nova.gmi.edu" with all the appropriate 
information.  Please tell me the exact path and location , or I can't 
put it in the list.  Recommendations from users are the only thing that 
keep the list growing! 

  ********************************************************************** 

   ******************** Frequently Asked Questions********************

FAQ                     Keith Maddock
Contains valuable answers to frequently asked questions.  Read it!
SX/GX                   
cbs.cis.com: /pub/hp48g/uploads/48faq301.zip 

              ******************** Games********************

Arkanoid                HP Mad
Breakout game, editor
SX                      9k
GD 8
            
Boulder DasHP           David Presle aka ORUS
Classic game of Boulder Dash - get the diamonds without getting smashed
SX                      14.5k
GD 8

Columns                 Spartacus
Tetris-like Game
SX/GX                   13k
cbs.cis.com: /pub/hp48g/games/columns.zip

Columns 2               Spartacus
Columns with grey scale
GX
cbs.cis.com: /pub/hp48g/uploads/columns2.zip

Diamonds                Doug Cannon
Great game! - bounce to get the Diamonds! Editor's favorite!
SX                      12k
wuarchive.wustl.edu : 
/systems/hp/hp48/comp.sources.hp48/volume09/diamonds.mf
GX (converted to GX by Herve Couplet)  13.9k
cbs.cis.com: /pub/hp48g/uploads/diamonds.lib ***

Double Tetris           Christian Bourgeois
Fast, smooth tetris, with 2 player via IR! Can play SX vs GX!
SX                      9.8k
bode.ee.ualberta.ca:      /pub/HP48/games/france/detris.zip
hemul.nada.kth.se:        /home/d89-bga/hp/games/dtetris.zip
GX                      12k
cbs.cis.com: /pub/hp48g/uploads/dtetris.lib ***

Frogger 1.0             Dallan Christensen
Classic Game of Frogger for the HP48
SX                      7.9k
cbs.cis.com: /pub/hp48g/uploads frogv10.zip ***

Garbage                 Detlef Muller
Sokoban Clone
SX/GX                   7.6k
cbs.cis.com: /pub/hp48g/games/garbage.zip

H. Piper!               Raul Raines
Like Pipe Dreams , SCHIP
SX/GX                   1.9k
GD 3

Hapaman                 Davor Jadrijevic
Pacman Clone
GX                      5.4k
cbs.cis.com: /pub/hp48g/games/hapaman.zip

Ice Cube v1.1           Pigallio Lilian
Great action video arcade game! Uses 4 color gray scales.
SX/GX                   20k
GD 9, cbs.cis.com: /pub/hp48g/uploads/ice1_1.zip ***

Joust                   Erin S. Catto
Joust video arcade game, SCHIP
SX/GX                   2.4k
GD 5

La Mine aux Diamants    Pigallio Lilian
Boulder Dash clone
SX/GX
cbs.cis.com: /pub/hp48g/uploads/diamants.uue ***

Lemmings	        C. de Dinechin
Save the lemmings from killing themselves..
GX
cbs.cis.com: /pub/hp48g/uploads/lemmings.lib ***

Phoenix                 Davor Jadrijevic
Phoenix Clone
GX                      9.4k
cbs.cis.com: /pub/hp48g/games/phoenixg.zip
SX
seq.uncwil.edu: /hp48/Uploads/phoenixs.zip ***

Reversi                 Leon Pavlov
Quick Reversi
SX                      
GD 8

SCHIP                   Erik Bryntse 
Video Game interpreter, runs SCHIP games
SX                      2.2k
GD 3
GX                      
cbs.cis.com: /pub/hp48g/games/schipgx.zip

Shapes                  Doug Cannon
Mastermind, Hi Score
SX/GX                   7.2k
cbs.cis.com: /pub/hp48g/games/shapes.zip

Skunk                   Doug Cannon
Dice Game
SX/GX                   11k
cbs.cis.com: /pub/hp48g/games/skunk.zip

Space Trek 48 (alpha)   Jim Donnelly (One of the HP48 design team!)
Classic Star Trek for the HP48!
SX/GX                                        
cbs.cis.com: /pub/hp48g/uploads/trek48.zip ***

Super Car               1K1
Race around the 5 tracks
GX                      15.7k
cbs.cis.com: pub/hp48g/uploads/supercar.gx ***

Tetris                  Detlef Mueller
Tetris Clone - Small, Fast, Great!
SX/GX                   3.2k
wuarchive.wustl.edu : 
/systems/hp/hp48/comp.sources.hp48/volume10/tetris.dm

Vaders  v2.1            Joe Ervin
Space Invaders
SX/GX                   9k
cbs.cis.com: /pub/hp48g/uploads/vaders21.zip

Willy                   Mario Mikocevic Mozgy
Arcade adventure game
SX/GX                   17k
cbs.cis.com: /pub/hp48g/uploads/willy.zip ***


            ******************** Utilities********************


4colors                 Pigallio Lilian
Utilities for making 4 grayscale graphics
SX/GX
cbs.cis.com: /pub/hp48g/uploads/4colors.zip ***

Billy v4.0
Converts some SX applications to run on GX
GX
cbs.cis.com: /pub/hp48g/uploads/billy40.lib ***

BKUP 4.1                Bob Apodaca
Complete memory backup utility w/ xmodem.  A must if you use ram cards!
SX/GX
cbs.cis.com: /pub/hp48g/uploads/bkup41.zip ***

Clk                     HP      
Keeps clock very accurate       
SX/GX                   7k 
GD 8

CodeLock       
Password protection program
SX                      Scotty Thompson
GD 7
GX                      Todd Eckrich 
cbs.cis.com: /pub/hp48g/uploads/codelk13.lib ***

Copy-Rom                Burhan Afandi
Copies contents of ROM or RAM cards to another port, or your PC
SX
wuarchive.wustl.edu: /systems/hp/hp48/util/copyrom.Z

Fixit v3.2              Mika Heiskanen & Joe Horn
Repairs "HPHP48-" Bad Downloads
SX/GX
GD 8 (also see OBJfix)

FoneManager v1.4        Jeoff Krontz
Database Program
SX/GX                   
GD 9, cbs.cis.com: /pub/hp48g/uploads/foneman14.zip ***

fxrecv                  Cary McCallister
fixes bug in xmodem for G/GX
GX                      0.099k
GD 9

GROBer                  Donald R. Asmus
Convert GROB to Mac PICT
SX/GX                   
wuarchive.wustl.edu : /systems/hp/hp48/binaries/GROBer.hqx.Z

Gateway 48 v2.8b        Erik Bryntse
Password Protect your HP
SX                      2k
GD 7

HP Development Tools    HP
Development Tools for System RPL and libraries on PC.
MS-DOS, SX/GX                                  
GD 4

MS-Kermit v3.11         Columbia University
MS-Kermit works with Kermit on your HP for file transfers.
MS-DOS <-> SX/GX
wuarchive.wustl.edu : /systems/hp/hp48/kermit/kermit311.zip

OBJfix                  HP
Fixes Bad "HPHP48-" downloads
SX/GX
GD 9

PSND                    Brian Maguire
Send Objects from a Port
SX                      
GD 7

RPL-48                  Detlef Mueller
HP48 Developing System  - System RPL, Libraries
SX/GX                   
cbs.cis.com: /pub/hp48g/programming/rpl48v20.zip

Remote 3.3 BG           Bjorn Gahm
Use HP48 as a remote control for most anything
SX/GX
nada.kth.se: /home/d89-bga/hp/files/posted/rem33bg.zip

Remote3                 Detlef Mueller
Learning Remote
SX/GX                   
GD 7

Remote4                 Steve VanDevender
Learning Remote
SX/GX                   
GD 7

SCH48                   William J Levenson
A scheduler w/ calendar, appt. management, daily timeline, etc.
SX/GX
cbs.cis.com: /pub/hp48g/uploads/SCH48v20.zip 
wuarchive.wustl.edu: /systems/hp/hp48/comp.sources.hp48/volume09/sch48.bl
GD 9

Ship                    Mark Adler
Ship and Unship ( .exe and .C source)
MS-DOS or any platform with C compiler
cbs.cis.com: /pub/hp48g/dos/unship.zip
Note: See FAQ for info on using Ship, and getting Ship on other platforms.

SSS                     Stefan Wolfrum
SysRPL Shell, helps programming in SysRPL
SX/GX                   15K 
cbs.cis.com: /pub/hp48g/uploads/sss22.zip

Stack Display           Rick Grevelle
Display 4/5/7 size stack
SX                      
GD 8

Sto-Fix                 Detlef Muller
Fixes Bugs in ROMs L, M
GX                      
cbs.cis.com: /pub/hp48g/utilities/stofix.zip

String Writer v4.1b     Jean-Yves Avenard
Great Editor       
SX/GX                   16.5k
cbs.cis.com: /pub/hp48g/uploads/stwrt41b.zip ***
Note: v4.2 is available through author for a fee.  See v4.1b for details.

USEND/URECV 3           Dan Kirkland
Significantly faster IR file transfers (4-6x faster than SEND)
SX/GX
cbs.cis.com: /pub/hp48g/uploads/usnd3.dk ***

           ******************** Scientific********************

Circuit Simulator 2.61  Per Stenius
Makes DC, AC, and transient simulations, and more
SX/GX
cbs.cis.com: /pub/hp48g/electrical/csim261.zip

              ******************** Math********************

ALG48 V1.0              Claude-Nicolas Fiechter
Advanced algebraic symbolic calculations, sybolic matrices
SX/GX
cbs.cis.com /pub/hp48g/uploads/alg48v10.zip ***

CNTR 3.00               Cesar Crusius
Discrete/continuous control systems design. Inv. Z and Lapalace trans.
SX/GX
cbs.cis.com: /pub/hp48g/uploads/cntr300.zip ***

Math v2.10              Cesar Crusius
Symbolic/numerical Matrices, polynomials
SX/GX                   
cbs.cis.com: /pub/hp48g/uploads/math210.zip ***

PROOT                   Bill Wickes
Super Fast Polynomial Roots finder
SX
GD 7
GX
Built in: [PURPLE/LEFT-SHIFT-SOLVE] [POLY] [PROOT]

QPiRac                  
Replaces ->Q, shows quotients, pi, radicals, LN, and EXP. VERY useful!
SX
cbs.cis.com: /pub/hp48g/uploads/qpiracs.v30 ***
GX
cbs.cis.com: /pub/hp48g/uploads/qpiracv30g ***

SIMN v4.1               Sune Bredahl
Solves systems of equations
GX
cbs.cis.com: /pub/hp48g/uploads/simneq41.zip ***

 
             ******************** Docs ********************

Batts                   Joe Horn
Info about Batteries
SX/GX                   
GD 8

Drain.doc               Doug Cannon
Battery Drain Table
SX/GX                      
GD 9

GX Programming Tips     Doug Cannon
Developing Tips
SX/GX                   
cbs.cis.com: /pub/hp48g/programming/gxtips.zip

Library                 Charlie Patton
Library Info
SX/GX                   
GD 8

MLINPUT                 Joe Ervin
Keyboard Input from ML
SX/GX                   
GD 7


            ******************** Graphics********************

Bounce                  Doug Cannon
Status Line Animation
SX/GX                   
cbs.cis.com: /pub/hp48g/animations/bounce.zip

Claudia                 Mohamed Fatri   
Grayscale Demo of Supermodel
SX/GX
cbs.cis.com: /pub/hp48g/graphics/claudia.zip

Fantasma                Carl Gibbons    
Haloween Demo    
SX/GX           
cbs.cis.com: /pub/hp48g/animations/fantasma.zip

Hula                    Erick Hammersmark
Great Animation
SX/GX                   11.7k
cbs.cis.com: /pub/hp48g/animations/hula.zip

Tank                    Doug Cannon
Status Line Animation
SX/GX                   
cbs.cis.com: /pub/hp48g/animations/tank.zip

Train                   Jeremy Smith
Status Line Animation
SX/GX                   
cbs.cis.com: /pub/hp48g/animations/train.zip


           ******************** Music/Sound********************

Duet                    Carl Gibbons
Duet with two tones
SX/GX                   
wuarchive.wustl.edu : 
/systems/hp/hp48/comp.sources.hp48/volume11/duet.cg.Z

Tricorder               Steven Ourada
Beeps when close to an object, uses IR port, fun to amuse friends with
SX/GX
cbs.cis.com: /pub/hp48g/uploads/tricorde.zip

*** Note: Any programs in uploads directories are subject to movement 
into their appropriate directories (i.e. games or utilities), or removal 
by the archive maintainer.  There is also the possiblity that the program 
might a different zipfile name.  If information has changed that you know 
of , let me (keithm) know.  Also, programs in the uploads directories of 
cbs.cis.com are not necessarily GX compatible.  Please do not upload non-GX-
compatible programs to cbs.cis.com.  thanks!

  ********************************************************************** 
                   ***********************************
                       APPENDIX 1: OTHER FTP SITES
                   ***********************************
                                                                       
hpcvaaz.cv.hp.com       :       /pub
hpcsos.col.hp.com       :       /pub
gmuvax2.gmu.edu         :       /hp48      
oak.oakland.edu         :       /pub/ham/hp48  (amateur radio related files)
plains.nodak.edu        :       /pub/hpcalc/hp48
ee.utah.edu             :       /hp48   
calvin.stanford.edu     :       /new_uploads
ftp.eu.net              :       /newsarchive/comp/sources/hp48  
ftp.itc.univie.at       :       /pub/hp48 (mirror of seq.uncwil)
bode.ee.ualberta.ca     :       /pub/HP48
faui43.informatik.uni-erlangen.de : /pub/hp48 
ftp.fht-mannheim.de     :
nic.funet.fi            :       /pub/archive/comp.sources.hp48/index 
                                /pub/misc/hp48sx 
hplyot.obspm.fr         :       /hp48 /hp48/mirrors/cbs.cis.com
ftp.luth.se             :       /pub/misc/hp48
nada.kth.se             :       /home/d89-bga/hp
puffin.doc.ic.ac.uk     :       /computing/systems/handhelds/hp48

                   ***********************************
                         APPENDIX 2: FTP BY MAIL
                   ***********************************

        For those of you who don't have FTP access, you can FTP 
programs by mail.  To do this, you send commands via email message to 
the ftpmail server, and it then sends back the programs, usually in a 
uuencoded format by email 
  
        For access to any ftp site, I use the sunsite ftpmail server.  It is 
the fastest I've used.  To get more information, send a mail message to 
"ftpmail@sunsite.unc.edu"  with the content of: 
help 
quit 
        There are other FTP by mail servers like the sunsite server, but 
they are much more heavily used, and take longer.

                   ***********************************
                    APPENDIX 3: BBS'S WITH HP48 STUFF
                   ***********************************

(206) 562-7083 644-2723 Foundations in Science 14.4 civan@eskimo.com  (48/100)

(205) 895-6152 (300-2400) UAH ACCESS BBS, U. Alabama Huntsville.(28/48/95/100)  
(205) 895-6992 (9600-14.4)Join Conf.#17 for instant HP48 access, has G-Disks 

(405) 372-7204 The Ninth Bit BBS 14.4 scott.wilkins@ninth.ucc.okstate.edu(48)

(416) 968-6633 Raiders of Lost Arg 38400n81 john.ricciuti@can.rem.com  (48/95)

(503) 640-4263 NES BBX goodies disks in file area 22                      (48)

(503) 750-4448 The official Hewlett Packard BBS, Corvallis, OR            (48)  
(503) 750-3277 Second node, 9600 baud

(514) 472-8565 Adanac BBS, FidoNet FREQ 1:242/818, 2400n81 (28.8 soon)    (48)

(612) 642-5906 [(hp)]al BBS,usenet,in ternet mail, rab@lydia.mn.org (48/95/100)

(617) 558-4582 Electronic Design News BBS, open to all                    (48) 

(708) 304-0666 Nybble's Byte 24 hr 28.8kbps Usenet/Internet (28/48/95/100/etc)

(708) 657-9543 Terrapin Station

(801) 371-8760 '48 Files BBS, over 3000 HP48 files and more, 14.4.        (48)

+33-149-887-691 THE 0NE BBS, France, lots of latest French warez for 48   (48)

                   ***********************************
                       APPENDIX 4: HP GOODIES DISKS
                   ***********************************
        
        The HP Goodies Disks are a set of disks that are chock full of 
great HP48 files.  They are collected by Joe Horn, and sold through 
Educalc.  They contain all shareware/freeware files.  Right now there are 
9 disks.  They can be obtained via anonymous ftp from the places listed 
below. , or they can be purchased from EduCalc. In the listings above, 
they are referred to by "GD #".  All the goodies disks have a file 
"fileinfo.src" which contains an index of all the files.  I would 
recommend everybody looking through all these disks, as there is lots of 
GREAT stuff on them! 

EduCalc: 1-800-677-7001

wuarchive.wustl.edu: /systems/hp/hp48/EduCalc 
                        (Disks 1-8)           
also at:
hplyot.obspm.fr, bode.ee.ualberta.ca, UAH BBS

Compuserve (see beginning of this list)

Somebody has started a mailserver for the Goodies Disks.  I'll paste his
message directly in from his posting:

 "If you want to get the goodies disks you must mail:
  File-Request@ve6hf.ampr.ab.ca

  In the body of the message type in:  
  HELP
  QUIT

  To get a file from the HP directory type in:
  GET /files/hp/filename.zip UUE
  QUIT
                "

                   ***********************************
                         APPENDIX 5: CONTRIBUTORS
                   ***********************************

Keith Maddock thanks the following international contributors (11 
countries) for their invaluable help in compliling this list: 
                                                  
United States           Europe, North and South America
--------------------    ------------------------------------
Doug Cannon             Maarten van den Hoek (Netherlands)
David Peterson          Pieter-Bas IJdens (Netherlands)
Egan Ford               Bjorn Gahm (Sweden)
Jeremy Smith            Cesar Crusius (Brazil)
Chris Spell             Stevens Wouter (Belguim)
Chuck Dinsmore          Wlodek A C Mier-Jedrzejowicz (U.K.)
Dallan Christensen      Jens Kerle (Germany)         
Andrew Dooley           Yves Gadioux (France)       
Thomas De Matteis       Jean-Francois Larin (Canada)
Allen Arnold            Kevin Cheng (Australia)
David Moisan            Ryan D Youck (Canada)
Rich Brown              Lilian Pigallio (France)
Maynard Riley           Mario Mikocevic Mozgy (Croatia)
James Cook              Rachid Benzaoui (HPdream) (France)
Ray Richardson          Stefan Wolfrum (Germany)

  ********************************************************************** 


END PART 4 OF 4

END FAQ