Path: utzoo!attcan!uunet!lll-winken!lll-tis!helios.ee.lbl.gov!pasteur!agate!saturn!venus!taff
From: taff@venus.ucsc.edu (Thomas Affinito,,,4582136)
Newsgroups: comp.sys.hp
Subject: HP-28 directory assistance
Summary: an operating system on top of the HFS for the HP 28S
Keywords: HP 28S
Message-ID: <4115@saturn.ucsc.edu>
Date: 12 Jul 88 08:46:21 GMT
Sender: usenet@saturn.ucsc.edu
Reply-To: taff@venus.ucsc.edu (Thomas Affinito)
Organization: University of California, Santa Cruz; CIS/CE
Lines: 791
{this is a lonng post with program stuff in it ... you might want to Save it}
The 411 (Directory Assistance) System Version 3 for the HP 28S
copyright Tom Affinito 1988; these programs may be used, modified, copied, and
distributed by individual users and user groups; they may not be published in
non-user group media
****************
Introduction
A hierarchical memory structure CAN provide a nice method for organizing
the ever-accumulating wealth of variables an active user creates for himself.
More often than not however the user spends too much time using ORDER and going
up and down the path trees trying to find where some particular variables are.
My first 28S programming project was to tame this hierarchy with an operating
system built on top of the tree structure so that the user would be more or
less freed from traversal commands.
My idea was to implement a workspace concept (ala APL) with specific properties:
1: the user should have simple commands to automatically create (BUILD)
and disassemble (CRUSH) a workspace
2: the workspace would act as a test bed for developing and playing with
new programs and ideas
3: finished programs and variables could be removed from the USER menu
(HIDE) and pushed into a parent directory from which they could still
be accessed; additionally, programs and variables of more general
utility could be pushed to an even higher parent directory which would
be visible to all created workspaces (STALL, short for "install")
4: main operating system commands should be assessed through the custom
menu for ease of use; additionally, the user should be able to create
specific labels that will always be loaded when the particular workspace
is activated (SLAB); general labels (present for all workspaces) should
also be possible (GLAB); thus the user can HIDE or STALL all his
programs, and SLAB or GLAB the main applications, which gets everything
out of USER space, keeps all the utilities opaque, and gives some
transparency to the applications
5: the user should be able to switch from workspace to workspace with
simple commands; tree traversal should be completely eliminated
6: the operating system should not take up too much memory
Whether I have achieved these goals is up for grabs....though I certainly feel
the system is pretty good! It has been thoroughly debugged, is filled with
interesting utilities, is easily customizable, and only takes up slightly
more than 2K (a small price to pay with the 28S). This is the system I use
for all my program development. I am interested in all comments/criticisms/
improvements to this system .... please send me email, and I'll post summaries
to the net when warranted.
*******************
Version 3?
After programming on the 28C for six months, I was thrilled when the 28S came
out and bought it immediately. 411 was created to manage my program
development style. After reading Wlodek's book ("Customizing Your HP 28"...
which I recommend though it doesn't really have much specific 28S stuff) I
realized that I had to move the operating system from the home directory
to a subdirectory so that a could keep all my PEEK and POKE programs in the
HOME directory. This led to some increased generality and Version 2 arose.
Three days ago I got Bill Wickes book ("HP 28 Insights" ... highly recommended
... it's basically Bill's hybrid expansion of the Owner's Manual and Reference
Manual, with some interesting suggestions on how to use the calculator that you
probably wouldn't have thought of ... like how to make Solver variables act like
constants!) Some of his programs duplicated utilities I had created, which is
expected. In order to make 411 more accessible I changed some of my programs
to have the names he used, and used his algorithms instead of mine. To wit:
UP -- This is given on page 83 of his book, and is also in the HP
Owner's Manual; my UP program originally returned the PATH
it had just left to the stack....so my programs had pairs of
UP and DOWN (which executed a path on the stack) when I did
traversal.
DOPATH -- This is given on page 84; my program to do this was called
DOWN, but I changed the name to conform; my algorithm is not
that given by Wickes...mine uses utilites Bill does not include
in his book, and mine is more general as it will execute a list
or a name.
Purge, Clusr -- I had a single program (actually a string) which did
a complete directory clear (called XCL for extra clear)...Bill's
Purge does the same thing, so I have used his names and
algorithms....with the exception that Clusr is put into a string
object! I did this for protection; having a key that can wipe
out ALL of your memory if pressed is TOO DARN DANGEROUS! I
almost lost everything when I was developing my XCL program!
So you do Clusr STR-> to do this program, which can not be
accidently pressed by a fumble-fingered programmer.
*************
What To Do
The end of this post has all the program listings and variable defaults; just
type them in! Just to prevent some possible confusion though:
In the Home area you store the program ON411, and create the directory
->411; thus the HOME area is free to put all those programs that need
to access the top of memory as Wlodek explains (in a sense, the HOME
area becomes the "Assembly/Machine Language Experiment Area".
In the ->411 directory go all the remaining things, except that
you must create a directory here called UTIL and store GU.LS in
it.
The "" you see in some programs are just two quotes...which I happen
to use as separators in the custom menus.
The variables are listed in the order in which they appear in my
USER space....organized from variables to high level commands to
low level utilites. You might want to enter these in reverse order
and use the USER menu to enter previous utility names for you.
***********
The Directory Layout -- What This Program Does
Say you create two workspaces named PROB and STAT (how to do this is described
in the next section). 411 creates the following directory structures for you:
HOME
::
::
->411
::
::
UTIL <- place general utilities here
// \\
// \\
// \\
:: ::
:: ::
PROBUTIL STATUTIL <-- place specific utilities here
:: ::
:: ::
WORK WORK
^ ^
| |
do your prob do your stat
work here work here
411 automates the creation, destruction, and traversal of these memory
structures. It also automates movement of completed programs/objects into
the specific utility areas or into the general utility area. It also controls
workspace specific changes to the custom menu so that specific and general
applications can remain transparent by being labelled in this menu.
SideNote: This type of structure is the same as that suggested by Wickes on p.77
of his book. As I skimmed the book initially I feared he would provide programs
to do what 411 does, making all my effort for nought. Fortunately he does not!
Thus I hope this post can supplement and illustrate the ideas presented in
his book, and help all net-users manage their directories in a manner approved
by the Master.
**********
How To Use It
Starting Up: MAIN, ON411
MAIN creates a custom menu of all current workspace names followed
by the commands EXIT, BUILD, and CRUSH.
From this menu you can go to any workspace by pressing the workspace's
name....you can also execute any of three commands listed above.
MAIN is also available in the custom menu once you are in a workspace;
pressing MAIN is usually done when you're finished using one
workspace and want to go to the main menu to see the other spaces
you can go to, or to use one of the BUILD/CRUSH/EXIT commands..
If you are in the HOME directory, activate 411 thru ON411, which
goes into the appropriate directory and executes MAIN for you; after
you have EXITed 411 and returned home, ON411 is placed on the custom
menu for your conveniance.
Leaving 411: EXIT
EXIT takes you HOME and sets up a custom menu with ON411 in it.
Leaving a Workspace: MAIN, WOFF
MAIN brings you to the main menu.
WOFF (Workspace Off) is used at the end of the day to move you to the
main menu, clears the stack, and reset the flag modes you like.
Building new workspaces: BUILD
Type in a name for your space, then BUILD. After a while
the MAIN command menu will be activated with a label for your
new space. Enter your space by pressing its name. Go back to
MAIN by choosing the custom menu and pressing MAIN.
Removing old workspaces: CRUSH
Type in the name of an existing space, then CRUSH. All variables
and subdirectories associated with your workspace are PURGED,
and the label is removed from the custom menu.
Hiding variables: HIDE, STALL, SEEK
To have variables executable in your workspace, but hidden from
the USER area, put all of their names in a list and execute HIDE
from inside your workspace area.
To have variables executable by all workspaces, use STALL
instead of HIDE.
To retrieve variables that have been HIDEn or inSTALLed, use
a list of the variable names followed by SEEK. SEEK stores the
retrieved variables in the current directory....but it does not
change any specific or global labels so you might want to LABOUT
these too.
Controlling Custom Menu : SLAB, GLAB, LABOUT
SLAB takes a list and adds the objects in it to the Specific
command list. Whenever you are in this workspace, you will
see any commands you have SLABbed as the first commands in the
custom menu. This is generally used in the following way: let's
say I've got a specific application program called APP which
uses specific utilities U1, U2, and U3. I've debugged it
thoroughly and it's ready for use, so get all of this stuff
out of the USER area by {APP U1 U2 U3} HIDE, then make
APP visiblle in the command/custom menu by {APP} SLAB. (You
could alternatively type in 'APP' SLAB. HIDE, STALL, SEEK,
SLAB, GLAB, and LABOUT can take a name instead of a one element
list. So can MOVE and the utilities DELL and VL->S.)
GLAB works similarly for the Global command list which will
effect all workspaces.
LABOUT removes a list from the Specific and General command
lists.
Moving Variables To Another Workspace: MOVE
Type in a list of variable names, then the name of the space you
want to move to, then MOVE. The benefit of this over the sequence
"{variable name list} VL->S 'name of other workspace' EVAL S->VR"
is that this latter sequence will cause execution of SWON and WON
which could be modified to do strange things (like RESET) which
could blow the stack. NOTE: MOVE DOES NOT purge the original copies
of the variables.
***********
Illustrated Example
OK, you've just typed in 411...so let's go!
HOME
we're at the top level now, so if you want to do some PEEK and POKE
programs go right ahead....if you're not into that sort of
thing say Goodbye to the Home directory because you'll never
need to see it again!
ON411
we're in the system now. No workspaces exist, but the three commands
are present along with the little delimiter that separates
workspace names from the commands. Let's create four
workspaces: PROB to hold all my probability programs and work,
ML to hold some machine-learning stuff, TEST to just mess around
in, and WIX to hold all the programs I type in from the Bill
Wickes' book.
'PROB' BUILD
'ML' BUILD
'WIX' BUILD
'TEST' BUILD
as we do these commands, the workspace names appear in the custom
menu. Let's do some probability work.
PROB
suddenly we're in the blank USER menu of our new workspace. Activate
the custom menu and you'll see the commands HIDE, MAIN, etc.,
as well as some initial delimiters that will separate your
specific PROB labels from general labels. Return to the USER
menu.
3 4 5 'A' STO 'B' STO 'C' STO
we're creating some dummy variables to demonstrate the data hiding
features. In real life, we would hide utility programs and
useful applications that used those programs.
'A' HIDE 'B' STALL
A and B dissappear from the USER menu!
A B
The numbers 5 and 4 return! A and B still exist...they're just hidden.
Now let's go to a different workspace. Activate the custom
menu, then
MAIN WIX
Once again a blank USER screen faces us...we're in the WIX workspace
now.
A B C
A returns 'A' because the WIX workspace can't see the 'A' that was
HIDEn by PROB; similarly, WIX can't see the 'C' that exists
in PROB; however WIX CAN see 'B' which was inSTALLed as a
general hidden object. Thus we learn three things: 1) workspaces
are separate and independant from each other, 2) HIDEn objects
are still local to a workspace, though they are removed from
the USER area, 3) STALLed objects are hidden and executable
from all workspaces. Let's go back to PROB the fast way:
PROB
The PROB USER menu reappears. Now let's pretend that A and B are
important application program that we want to execute by key
from the PROB space.
{ A B } SLAB
The Custom Menu is on and you'll see A and B appear on keys. These will
always remain as keys in the PROB space until we remove them,
or we destroy (CRUSH) the PROB space.
WIX
Go to the Custom Menu and you won't find A and B keys...SLAB only does
specific workspace labelling.
PROB
Let's remove B as a specific label and make it a global label.
'B' LABOUT
The Custom Menu turns on and B has disappeared as a label. The variable
still exists however.
'B' GLAB
Notice how the position of 'B' has shifted...this is where global labels
appear.
WIX
Go to the Custom Menu. B is there on a key! Global labels appear in all
workspaces. Note that you can make anything that can be put
into a list a label. Note also that just because 'B' is a global
label is not a guarantee that 'B' is a globally hidden variable
(though this is how you should manage GLAB and STALL in
general). Labelling (GLAB, SLAB, LABOUT) is inndependant of
hiding (STALL, HIDE, SEEK). Now let's cleanup.
'B' LABOUT 'B' SEEK
These remove the global label and the global object, which would
otherwise remain when the specific workspaces are removed. (This
is good that they remain...we're just bringing them down to the
workspace level because we're trying to cleanup a silly
example!)
WOFF
'PROB' CRUSH 'WIX' CRUSH 'TEST' CRUSH 'ML' CRUSH
The best way to learn is to create some more examples and play on your
own. Learning 411 is easy if you take the time, and will reward you
in time and organization savings many times over.
***********
Shortcuts And Notes
As you learn the commands, you'll find that typing them in becomes easier
then going to the custom menu. The custom menu is there for backup and
keypress execution of your selected utilities.
To go from one workspace to another, you don't have to go through MAIN
or WOFF....just type in the name of the workspace you want to go to
and you're there. The main menu is always there in case you forget your names.
All the commands will still work even if you have created a subdirectory in your
work area, or a subdirectory in your subdirectory, etc. The only problem is that
if you HIDE or STALL variables that are not located in the current directory,
the WORK directory, or the specific utility directory, then they will be HIDEn
correctly but their original copies will still exist too in whatever arcane
subdirectory they happen to reside in. This problem should never arise though
if you use this utility correctly (the only need for ANY subdirectories below
the WORK area is for storing simultaneous SOLVER solutions to a current EQ.)
BUILD and CRUSH pop you up to the main menu. Also, BUILD and CRUSH are supposed
to be infrequent commands...workspaces are for WORKING in! Workspaces should
be tailored to produce efficent problem-solving environments. (Despite the
next Note!)
Create a DEMO workspace so when you want to show off the HP28 to your friends
you can simply go there and make a big mess (creating subdirectories, changing
modes, loading up the stack), then clean the whole thing up with WOFF 'DEMO'
CRUSH!
***********
Utility Programs You Might Want To Use (For The Programmers)
BOOP Standard error tone. Make it whatever you want.
S->N If the contents of a string could be interpreted as a name or an
algebraic, it will convert the string to a name or algebraic.
O->S Takes a delimited object and turns it into a string w/o delimiters.
Works for names, lists, vectors.
Purge Purges ANY variable...including a non-empty directory.
Clusr Clears ALL of the variables in the current directory...including
non-empty directories. Must be executed with STR->.
DELL Takes a list or name in level 2, and a name of a list in level 1, and
removes all occurrences of the objects in the level 2 list (or just
the name) from the list in level 1. Nothing is returned to the stack.
RESET Clears stack and restores favorite flag state.
VL->S Takes a list of variables (or just a name) and recalls each variable
onto the stack followed by its name. At the end the number of variables
recalled is itself pushed onto the stack.
S->VR Takes the output from VL->S and turns it into variables in the current
directory. The combination of VL->S and S->VR make it easy to move
programs from the HOME directory into a workspace and viceversa...though
this sort of thing should be a rare occurrence.
UP Moves to the parent directory.
DOPATH Takes a list or name and executes it. Usually used to return to a
directory whose location has been saved onto the stack via the PATH
command.
*********
How To Customize It (Some examples)
{Apology: I should have commented my code!! But I wanted to post this fast
lest I start working on Version 4. My code is not too tricky....but you
are not expected to have to "understand" it to use it. If there are enough
requests I might be persuaded to produce a commented version for the net;
in the meantime, here are some easy solutions for customizing 411}
To change the entry behavior of every workspace --- modify WON (Workspace On)
all WON does at present is build the custom menu for the workspace;
let's say you want all workspaces to Boop whenever you enter them:
change WON to be << UCML Boop >>
To change the entry behaviour of a single workspace - modify SWON (Specific WON)
which is located in the specific utility directory above the current WORK area.
all SWON does curently is call WON;
let's say you're in the PROB workspace, and you want this particular
workspace to RESET when you activate it:
change it's SWON to be << WON RESET >>; note that you'll
have to go UP to modify SWON.
You don't like my "" menu delimiter -- remove each "" and following + from
MAIN and UCML.
There are specific commands you use a lot when you've EXITed 411. Modify
the list in EXIT to include ON411 and the commands YOU WANT. Now
whenever you EXIT a custom menu is built that is right for your
needs.
Your favorite flag state is different from mine. Set the calculator to the state
you like, then RCLF. Store this number in FVFLG in ->411. Now whenever
a RESET or WOFF happens you'll get your state.
You want your programs to change the custom menu and later restore the normal
workspace custom/command menu.
The workspace command menu is stored in CM.M which is in the utility
directory above your current WORK area. Simply do CM.M MENU to restore
the custom menu after you've changed it.
Accessing the menu label lists directly -- the variable SU.LS (specific utility
list) in the directory above the current WORK contains that workspace's specific
labels; GU.LS (general utility list) in the UTIL directory contains the global
labels.
**********
411
******* Home Directory Stuff
->411 Directory
ON411 ACTIVATE DIRECTORY ASSISTANCE
<< HOME ->411 MAIN >>
******* ->411 Directory Stuff
UTIL DIRECTORY WITH VARIABLE GU.LS IN IT
GU.LS GENERAL UTILITY LIST
{}
WK.LS LIST OF WORKSPACES
{}
CM.LS LIST OF MAIN MENU COMMANDS
{ EXIT BUILD CRUSH }
CU.LS COMMAND UTILITY LIST
{ MAIN WOFF "" HIDE SLAB "" STALL GLAB "" SEEK LABOUT "" MOVE }
FVFLG BINARY # REPRESENTING FAVORITE FLAG STATES
#8081FFD40000000h
MAIN GO TO MAIN MENU
<< HOME ->411 WK.LS "" + CM.LS + MENU >>
BUILD CREATE A NEW WORKSPACE
'name' :
<< HOME ->411 DUP O->S "UTIL" + -> n n.s
<< IF WK.LS n POS THEN "NAME IN USE" 1 DISP BOOP
ELSE 'WK.LS' DUP EVAL n + SWAP STO
"<>" + STR-> n STO
UTIL
n.s DUP S-N CRDIR STR->
WORK CRDIR
<< WON >> SWON STO
{} SU.LS STO
MAIN
END
>>
>>
CRUSH DESTROY A WORKSPACE
'name' :
<< HOME ->411 DUP O->S "UTIL" + -> n n.s
<< IF WK.LS n POS THEN n PURGE
n 'WK.LS' DELL
UTIL
n.s S->N Purge
MAIN
END
>>
>>
EXIT LEAVE DIRECTORY ASSISTANCE MODE
<< HOME { "" "" ON411 "" "" "" } MENU 23 MENU >>
HIDE HIDE THE VARIABLES INDICATED BY A LIST
{list} :
<< -> ls << PATH ls VL->S ls PURGE
WORK ls PURGE
UP S->VR DOPATH
>>
>>
STALL INSTALL THE VARIABLES (HIDE IN GENERAL UTILITY AREA)
{list} :
<< -> ls << PATH ls VL->S ls PURGE
WORK ls PURGE
UP ls PURGE
UTIL S->VR DOPATH
>>
>>
SEEK RETRIEVE THE VARIABLES INDICATED BY A LIST
{list} :
<< -> ls << ls VL->S PATH
WORK ls PURGE
UP ls PURGE
UTIL ls PURGE
DOPATH S->VR
>>
>>
SLAB PUT LIST IN SPECIFIC LABEL MENU
{list} :
<< SU.LS + PATH SWAP
WORK UP 'SU.LS' STO
DOPATH UCML >>
GLAB PUT LIST IN GENERAL LABEL MENU
{list} :
<< GU.LS + PATH SWAP
UTIL 'GU.LS' STO
DOPATH UCML >>
LABOUT PULL LABELS IN LIST OUT OF SPECIFIC AND GENERAL MENUS
{list} :
<< -> ls << PATH WORK UP ls 'SU.LS' DELL
UTIL ls 'GU.LS' DELL
DOPATH UCML >>
>>
MOVE MOVE THE VARIABLES SPECIFIED BY A LIST INTO ANOTHER WORKSPACE
{'name1' ... 'nameN} 'workspace name' :
<< -> nm << PATH SWAP VL->S
UTIL nm O-S "UTIL" + STR-> WORK
S->VR DOPATH >>
>>
WON WORKSPACE ON
<< UCML 23 MENU >>
WOFF WORKSPACE OFF
<< RESET MAIN >>
UCML USER CUSTOM MENU LIST MAKER
<< PATH WORK UP
SU.LS "" + GU.LS + "" + CU.LS +
DUP 'CM.M' STO
MENU
DOPATH
>>
UP ACTIVATE THE PARENT DIRECTORY
<< PATH DUP SIZE 1 - 1 MAX GET EVAL >>
DOPATH EXECUTE A PATH OR NAME
{path} :
'name' :
<< O->S STR-> >>
VL->S VARIABLE LIST TO STACK
{'name1' 'name2'...} : obj1 'name1' obj2 'name2'... N
<< {} + -> ls
<< 1 ls SIZE FOR j
ls j GET DUP
RCL SWAP
NEXT
ls SIZE
>>
>>
S->VR STACK OF VARIABLES TO VARIABLES
obj1 'name1' obj2 'name2' ... 'nameN' N :
<< 1 SWAP START STO NEXT >>
RESET CLEAN UP STACK AND RESTORE MODES
<< CLEAR FVFLG STOF >>
DELL DELETE A LIST OF OBJECTS FROM A NAMED LIST
{obj1 ... objN} 'name of list' :
obj 'name of list' :
<< SWAP {} + -> lsnm erls
<<
1 erls SIZE FOR j
erls j GET
lsnm EVAL
WHILE DUP 3 PICK POS DUP
REPEAT SWAP LIST->
DUP DUP 3 + ROLL
- 2 + ROLL DROP
1 - ->LIST
END
DROP lsnm STO DROP
NEXT
>>
>>
Purge PURGE ANY VARIABLE
'name' :
<< 31 SF IFERR PURGE THEN DUP EVAL
Clusr STR->
UP PURGE
END
>>
Clusr CLEAR ENTIRE DIRECTORY
"VARS LIST-> 1 SWAP START Purge NEXT"
O->S DELIMITED OBJECT TO STRING
{list} : "list"
'name' : "name"
<< ->STR DUP SIZE 1 - 2 SWAP SUB >>
S->N STRING TO NAME
"name" : 'name'
<< "'" SWAP + STR-> >>
BOOP ERROR SOUND (JUST LIKE THE INTERNAL SOUND)
<< 340 .07 BEEP >>
**********
Hope you enjoy this utility as much as I do!
Thomas J. Affinito
UC Santa Cruz, Board of Computer & Information Sciences
Internet: taff@saturn.ucsc.edu or taff%saturn@ucscc.ucsc.edu
Bitnet: taff@ucsccrls (probably)
Postal addr: Box 14 Grad Student Housing, 401 Heller Dr., Santa Cruz CA 95064