[comp.sys.handhelds] HP48 MPE uuencoded DEMO

ervin@pinbot.enet.dec.com (Joseph James Ervin) (05/16/91)

The following is an excerpt from the MPE User's guide, describing how to
download and use the MPE demo application.

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

     4.1  Application Overview

     This demo application is a simple demonstration of how MPE can be used
     to  do  graphical  animation of several objects on the screen at once.
     This also provides a good visual  demonstration  of  the  CPU  loading
     effects described in earlier sections.

     Basically,  the  application  consists  of  a  fire  button  and  four
     "bullets".   This  application uses the [+] button as the fire button.
     When the user starts the application, the screen blanks and waits  for
     the  user to press the fire button.  For each press of the [+] button,
     the application will fire a bullet.  The bullets start  at  the  upper
     left  of  the  screen and move down the screen, row by row, until they
     reach the bottom of the screen.  When any  bullet  reaches  the  lower
     right  of  the screen, the application stops.  When the user has fired
     all four bullets, the fire button is disabled for the remainder of the
     application.   The  [.]  key  quits  the  application.   Refer  to the
     following section for how to download and run the application.



     4.2  Downloading And Running The Application

     Included in this distribution is  the  uuencoded  binary  file.   This
     binary  file is a directory containing the machine language code which
     makes up the MPE application, and a short RPL program which  runs  it.
     The  user  should  uudecode  this file and then download the resulting
     binary file in the usual manner to the HP48SX (make sure  to  set  the
     HP48SX  kermit  to  binary  mode.  The RPL program, "DEMO", in the new
     directory serves only to clear the display and set the display to PICT
     memory  before  running the machine language application ("XXX").  You
     should _not_ run the "XXX" program directly, since if PICT memory  has
     been  purged (by doing a PICT PURGE), then the application may corrupt
     memory.  Once started by  pressing  the  button  labeled  "DEMO",  the
     machine  language  program  can be aborted at any time by pressing the
     [.] button.

    
     4.3  Process Descriptions

     The following sections describe each of the seven processes which make
     up the application.  Note that processes #1 and #2 are not integral to
     the application and could be omitted.


    
     4.3.1  Process #1

     This is the process which is auto-executed  by  MPE  at  startup.   In
     terms  of the application, the only thing that this process does is to
     start up the keyboard scanner process  (#7).   Another  function  that
     this  process  performs,  in  conjunction  with  process #2 is to do a
     register context integrity test periodically while the application  is
     running.  This was written mainly for debugging MPE, but may be useful
     to the programmer in general, so I have left it in.  It runs once  per
     second, so it does not add significant overhead to the application.



     4.3.2  Process #2

     This process does nothing except clear all  the  processor  registers.
     The  purpose of this process is to work with process #1 to implement a
     register context integrity test.

   

     4.3.3  Processes #3, #4, And #5.

     These processes are grouped together here because they share the  same
     process  definition.   This process definition shows a good example of
     how to share code between two or more processes.  The  code  for  this
     process  definition  makes  use of the IF_PROC/ENDIF_PROC macros to do
     conditional execution of certain sections of code based on the current
     context ID.  For example, the three bullets owned by processes #3, #4,
     and #5 all move at different speeds on the screen.  This was done here
     to  visually  show the independence of the bullet processes running in
     the system.  The process definition uses the IF_PROC/ENDIF_PROC macros
     to  schedule  the  correct  process  at  the  correct  interval,  thus
     determining the speed of each bullet.

     One thing to note is that this process definition does not attempt  to
     control the speed of a bullet with great accuracy.  In other words, as
     the four bullets are fired and the CPU becomes  more  heavily  loaded,
     the  speed  of  the  bullets corresponding to processes #3, #4, and #5
     will slow down slightly.  This  is  due  to  process  latency  in  the
     scheduler.   Process  #6 shows a similar bullet process, but one which
     keeps track of absolute time and maintains an accurate velocity on the
     screen, independent of CPU loading.



     4.3.4  Process #6

     This  process  definition  is  very  similar  to  that  which  defines
     processes #3, #4,and #5.  The main difference is that process #6 keeps
     track of absolute time, making sure that its bullet moves  at  exactly
     the  velocity  indicated in the process definition.  In this way, even
     though the bullet for this process does not start  until  the  CPU  is
     already  very  busy with the other three bullets, it will maintain its
     velocity at the expense of the other three bullets.

         
     The effects of the use  of  absolute  time  in  this  process,  versus
     relative  time in the other three bullet processes, can be seen in two
     ways.  The first way is that after firing the four bullets, it  should
     be  discernible  that  the  fourth  bullet (process #6) moves slightly
     faster than the second one (process #4).  By examining the definitions
     of these processes, one quickly sees that processes #4 and #6 have the
     same rescheduling interval.  The  difference  in  speed  is  therefore
     attributable  to  the  time that process #4 loses while sitting in the
     RUN_LIST waiting to be run by the scheduler.  Since process  #6  keeps
     track  of  absolute  time  internal  to  itself,  this queuing time is
     accurately recovered each time the process is invoked.

     The second way that the use of absolute time in process #6 can be seen
     is  by  pressing  and briefly holding the [ON] key.  Pressing this key
     temporarily halts execution of the calculator, causing  all  processes
     to pause.  When the key is released, however, the bullet of process #6
     will quickly "zip" ahead to catch up to where it should be.  A similar
     effect  can  also  be  seen  by  pressing  and  holding some other key
     (besides  [ON]).   Since  the  keyboard  controller  causes  lots   of
     interrupts  in when this is done, it has the effect of heavily loading
     the CPU.  What can be seen on the display is that while the user holds
     down  a  key and thereby loads the CPU, the three bullets which do not
     use absolute timing slow down noticably, while the bullet for  process
     #6  maintains  its  correct  average  velocity.   The  manner in which
     process #6 "catches up" to where it should  be  can  be  seen  in  the
     bullet's jumpiness.



     4.3.5  Process #7

     This process comprises the  keyboard  scanner.   This  process  simply
     checks the keybuffer for the [+] key, and if it finds it then the next
     bullet process is scheduled for execution.  If the [.] key is pressed,
     this  process will cause the application to exit and continue with the
     RPL thread.  This process runs approximately 8 times per second.

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


Here's the uuencoded demo application.  

****************************CUT HERE*****************************************
begin 750 mpe.
M2%!(4#0X+466*O!_8Q,    #6EI: \PM4#0!ME/I&!>S--0!  D         
M#-DKG;U-&1>S--0!  <#"!H7LS34 0 "$!P7LS34 0 $B!D7LS34 0 %R!D7
MLS34 0 &4AD7LS34 0  "!D7LS34 0                              
M                  !-&1>S--0!  D         #-FKF+T&          ?8
M"P       <@*      #VFA:S--0!    4#BVA4-=TME;$;ZJJJJJJJJJJJNJ
MJJJJJJJJK*K:JJJNJJJJJJJJJJ^JJJJJJJJJL*JJJJJJJJJQJJJJJJJJJK*J
MJJJJJJJJ5MH;7KX                                             
M                                    VMJ+<[X          %41!P  
M    0!%7%7$                     OAD'                        
M    7MO;@+X!         %\1!P      0!'W%7$                     
MOAD'                            XMO;@+X!         %41!P      
M0!%7%7$                     OAD'                            
M9MS;@+X"         %T1!P      0!'7%7%2&1>S--0!            OAD'
M                            ZMPKH;X&          8         Z@0'
M   &                                                    ;MW[
MLKY,V@NMO53;B[V]7-P+SKUDW8O>O?B;9X"Q%'O"_S'&$F,82T.:^\\21!A+
M0\T"P!)&082Q%%O'_S'&$F,82T/H^\\21!A+0\X&P!)&082Q%#O,_S'&$F,8
M2T,V_,\21!A+0X0(P!)&082Q%!O1_S'&$F,82T.$_,\21!A+0YD(P!)&082Q
M%/O5_S'&$F,82T/2_,\21!A+0V,(P!)&082Q%-O:_S'&$F,82T,@_<\21!A+
M0RT(P!)&082Q%+O?_S'&$F,82T-N_<\21!A+0P$*P!)&082Q%)OD_S'&$F,8
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
@  #@I (5            L!(#\.*!Y (#6EI:.3:R$@-T
 
end