PCjs Machines

Home of the original IBM PC emulator for browsers.

Logo

PC-SIG Diskette Library (Disk #454)

[PCjs Machine "ibm5160"]

Waiting for machine "ibm5160" to load....

Information about “UNIFORTH”

The UNIFORTH Sampler from Unified Software Systems is a subset of the
full Professional UNIFORTH.  It provides a full assembler, video editor
and software floating-point arithmetic.  It supports the FORTH-83
Standard with few exceptions.  You will find the Sampler to be the
equivalent of several commercial systems.

System Requirements:  64K, one disk drive and monochrome display.

How to Start:  For complete information on how to start enter TYPE
UNIFORTH.DOC and press <ENTER>.  This file also gives documentation on
the FORTH language. To start program type UNIFORTH and press <ENTER>.

Suggested Registration:  $25.00

File Descriptions:

UNIFORTH COM  UNIFORTH main program
WORDS    DOC  The vocabulary word list
VEDITOR  FTH  The configuration file for the video editor
FORTH    FTH  The default file that is opened when UNIFORTH is executed.
UNIFORTH DOC  Documentation for UNIFORTH (87K)

FILES454.TXT

------------------------------------------------------------------------
Disk No 454   UNIFORTH                                               v1
------------------------------------------------------------------------
The UNIFORTH Sampler from Unified Software Systems is a subset of the full
Professional UNIFORTH.  It provides a full assembler, video editor and
software floating-point arithmetic.  It supports the FORTH-83 Standard with
few exceptions.  You will find the Sampler to be the equivalent of several
commercial systems selling for $200 or more.

UNIFORTH COM  UNIFORTH main program
UNIFORTH DOC  Documentation for UNIFORTH (87K)
FORTH    FTH  The default file that is opened when UNIFORTH is executed.
              It contains the SYSGEN utility, the segment utility,
              a game and other stuff.
VEDITOR  FTH  The configuration file for the video editor
WORDS    DOC  The vocabulary word list

PC-SIG
1030D E Duane Avenue
Sunnyvale Ca. 94086
(408) 730-9291
(c) Copyright 1986,1987 PC-SIG

UNIFORTH.DOC








                              THE UNIFORTH SAMPLER



             The  UNIFORTH  Sampler is a subset of the full  Professional
        UNIFORTH.   It  provides  a  full  assembler,  video  editor  and
        software  floating-point arithmetic.   It supports  the  FORTH-83
        Standard  with few exceptions.   You will find the Sampler to  be
        the equivalent of several commercial systems selling for $200  or
        more.

             We decided to release the Sampler into the public domain for
        several reasons.   First, distributing a version of UNIFORTH that
        is  useful,  inexpensive  and  reproducible is  a  cost-effective
        method  of advertising.   Second,  it gives you a chance to try a
        good FORTH system at no cost.   If you don't like it, you haven't
        spent a dime.   If you do like it,  we ask (but don't demand!)  a
        $25  donation,  most  of  which  will be  reinvested  in  product
        development  to  improve both the Sampler and  the  Professional.
        Lastly,  the Sampler includes several novel features that we feel
        are  useful,   but  want  to  bring  before  the  community   for
        discussion.

             You  are  encouraged to copy and distribute the  Sampler  to
        your friends and local bulletin boards.   You may use the Sampler
        as the underlying language for a commercial software product.  In
        return,  we hope that you will consider us when you need a  full-
        featured FORTH system or other options,  and that you will spread
        the word about UNIFORTH.

             We  can  supply  you  with the latest disk  version  of  the
        Sampler  in your 5 1/4" or 8" (CP/M) format for $35,  or you  can
        obtain a copy from a friend or local bulletin board.  Consult the
        order form at the end for more details.

             This  manual is a much-abbreviated edition of  the  UNIFORTH
        Manual Set.  (The complete set has over 500 pages, and comes in a
        custom  slipcase/binder.   Copies of the full set are $60.)  This
        manual  is  divided  into four  sections:   an  introduction  and
        advertisement  for the Professional;  a brief tutorial on  FORTH;
        some  of  the  system-specific  features  of  UNIFORTH;   and   a
        vocabulary list.

             The  UNIFORTH  Sampler  is NOT a supported  product  and  is
        distributed without warranties of Merchantability and fitness for
        a  particular  purpose.    If  you  need  support,  purchase  the
        Professional UNIFORTH.













        THE UNIFORTH SAMPLER                               Page 1-2


        1.1  Getting Started

             The Sampler is distributed on one disk.  You can use the DOS
        utilities  COPY and DISKCOPY for backup and distribution  copies.
        You will find on the disk the following files:

             UNIFORTH.COM   The executable task image.

             FORTH.FTH      The default file that is opened when UNIFORTH
                            is executed.  It contains the SYSGEN utility,
                            the segment utility, a game and other stuff.

             VEDITOR.FTH    The configuration file for the video editor.

             UNIFORTH.DOC   This manual.

             WORDS.LST      The vocabulary word list.

             README.1ST     If   present,   additional  information  that
                            should be read before using the system.

        All  of  the features of UNIFORTH are preconfigured in  the  task
        image.   You  need not "load" anything to have a working  system.
        UNIFORTH.COM requires a minimum of 40Kb user space,  which  means
        that  you  may be tight if running on a 64Kb machine  with  DOS2.
        The Sampler will ONLY work with DOS2, and will bomb if you try it
        with DOS1.  In addition, the terminal I/O assumes a good PC clone
        that  has  a  compatible BIOS ROM.   If you are  using  an  MSDOS
        machine  that is not a clone,  you need to make one patch  before
        bringing  the system up.   Use DEBUG and change the "81" hex byte
        that  follows  the  ASCII string IOBYTE  located  somewhere  near
        address 1E6A to a "12" hex.

             Now start the execution of UNIFORTH by entering

                  UNIFORTH

        at which time you should get the Sampler startup screen.   If the
        screen  is blank or your computer hangs up,  then your system  is
        not PC compatible and you need to make the patch described above,
        or  else you have insufficient memory.   If you get a message  to
        the  effect of a missing file and an inquiry about  creating  it,
        answer  "N"  and leave FORTH at the earliest  opportunity.   Then
        make sure FORTH.FTH is on the same disk as UNIFORTH.COM.

             After  you get the "ok" prompt,  you're  into  FORTH.   Then
        follow  the  tutorial or an introductory text,  and learn  FORTH.

             There are three ways to exit UNIFORTH:  enter two successive
        control-C  keystrokes (which aborts);  enter the word END  (which
        has the same effect as the CTRL-C);  or enter BYE (which  flushes
        and closes files before exiting).











        THE UNIFORTH SAMPLER                               Page 1-1






                                   Chapter 2

                                   USING FORTH


             The  first  concept  to  understand in using  FORTH  is  the
        entering  and  execution  of words  through  the  terminal.   The
        general rules are:


             1.   FORTH does not interpret a line of user input until the
                  user  terminates the line by entering a carriage return
                  (<cr>).

             2.   You  may  delete the previous character by  entering  a
                  backspace (ASCII 08) or delete (ASCII 127).   An  ASCII
                  "bell" character will be output if you try to backspace
                  past the beginning of the line.

             3.   You may delete an entire line by entering a CTRL-U (the
                  CTRL and U keys depressed simultaneously).

             4.   The user may interrupt printout at any time by entering
                  CTRL-S.    The  printout  is  resumed  when  CRTL-Q  is
                  pressed.  (Some systems permit any key for resumption.)

             5.   You  can  abort  a task that is  actively  printing  by
                  pressing the ESCAPE key.

        After pressing the return key to terminate a line of input, FORTH
        will  go  through the line and execute every "word" in the  input
        line.  The definition of a FORTH word is very simple:

                              <<<WORD DEFINITION>>>

                       A FORTH word is a sequence of up to
                       64  characters,  with  at least one
                       blank (space) on  each  side.   The
                       sequence  of characters may contain
                       any  character  in  the  ASCII  set
                       except      control     characters.
                       UNIFORTH  retains  the   first   31
                       characters  and  the  length of the
                       word;  any word with the  first  31
                       characters and length identical are
                       not   unique.    All   words   with
                       identical  first  31 characters and
                       lengths greater than or equal to 31
                       characters     are    treated    as
                       identical.









        USING FORTH                                             Page 2-2




        For example, entering the line

                  OK 43 24 + LIST <cr>

        will cause FORTH to execute the four "words"

                  43         (push the number 43 on the stack)
                  24         (push the number 24 on the stack)
                  +          (add them together to get 67)
                  LIST       (and then list block 67)

        Notice the spaces between the words on the input line.  You don't
        need to type spaces before the first word or after the last  one.
        The  words are executed in the order in which they were  entered.
        The actual execution of each word will be discussed later.

             If  all goes well and FORTH successfully executes each  word
        in the input line,  then FORTH will respond with its prompt (OK).
        If  an error occurs,  the name of the word it was executing  when
        the error occurred will be repeated, followed by a question mark.


        2.1  The Stack


             To  see  how  FORTH does such things as  manipulating  data,
        controlling  devices,  printing and accepting user's  input,  and
        managing  files,  you will have to understand the mechanism  that
        FORTH uses to keep track of the work in progress:  the STACK.

             A stack (sometimes called last-in-first-out or LIFO  memory)
        is  a  device used largely in  compiler  writing,  microprocessor
        design,  and HP calculators.  A stack can best be compared to the
        tray holders commonly used in cafeterias:  the type with a spring
        at  the bottom to push up trays as they are used.   Only the tray
        most recently added is accessable;  it must be removed before the
        trays below it are available.

             To see how this relates to FORTH, we need to experiment from
        a terminal.   If you type a carriage return,  FORTH will  respond
        with

                  OK  <cr>
                  OK

        to  indicate that it has completed your previous request (in this
        case,  you requested nothing) and is ready to do  more.   Suppose
        you type a number:

                  OK  5 <cr>
                  OK










        USING FORTH                                             Page 2-3


        FORTH  has apparently done nothing;   however,  it has taken your
        number  (5),  interpreted it as the numeric value 5 (rather  than
        some other word), and "pushed" it onto the stack (added a tray to
        the holder).

             Suppose you type a series of numbers,  separated by at least
        one space so FORTH can tell them apart.   Basic FORTH only under-
        stands 16-bit integers,  i.e.   numbers between -32768 and  32767
        with  no  decimal  points or other punctuation except  a  leading
        minus sign for negative numbers:

                  OK 4 1 2 7 -23 6 <cr>

        (We'll  tell  you  about other number types later.)  FORTH  still
        doesn't  seem to have done anything,  but the stack now  contains
        the original number 5,  plus 6 new numbers,  with the "top" value
        being the number 6.

             Obviously something is missing:   a method of removing  data
        from the stack and doing something useful with it.   The simplest
        thing  that  can be done with the stack is to see what's  on  top
        (easiest to get at).   FORTH has a word,  "." (dot),  which takes
        the  number  on the top of the stack,  prints its  value  on  the
        terminal,  and  throws the number away.   (We will enclose  FORTH
        words in quotes whenever confusion is possible).   For an example
        of dot:

                  OK 8 .  <cr>
                  8
                  OK

        will take the number 8,  push it on the stack,  then print it and
        prompt for more input.  Another example,

                  OK 8 7 .  CR .  <cr>
                  7
                  8
                  OK

        will type the two top stack values on separate lines.   CR is our
        second learned FORTH word:  it just outputs a carriage return and
        line feed to the terminal.


        2.2  Stack Operators


             So  far we can only get to the topmost stack value.   As  on
        the HP calculators,  there are words that allow us to  manipulate
        the stack to get at other values.   The table below lists some of
        the  most important operators.   For this and subsequent  tables,
        the topmost stack value is indicated by A,  the next stack  value
        by B,  and so on.   The table gives the word, its function, and a
        representation of the stack before and after the use of the word.









        USING FORTH                                             Page 2-4



             WORD          FUNCTION         BEFORE    AFTER
             DUP        copies top of stack    B A     B A A
             SWAP       reverses top two       B A     A B
                        numbers on the stack
             DROP       destroys top of stack  B A     B
             OVER       copies 2nd number and  B A     B A B
                         pushes it on top
             ROT        moves 3rd num to top   C B A   B A C
             -ROT       moves top to 3rd num   C B A   A C B


             The  usefulness  of these stack manipulation  words  becomes
        apparent  when  you  consider  the  following  problem:   suppose
        someone  else  has  put  a number on the stack and  you  wish  to
        calculate its square without knowing what it is.  You could type

             OK  DUP * . <cr>
             25
             OK

        By inference,  the number on the stack was 5.  Of course, we used
        a  word  not defined yet to multiply the two  values.   So  let's
        digress and discuss arithmetic functions.


        2.3  Arithmetic Functions


             All  arithmetic  functions act on the stack  with  a  method
        called  postfix or Reverse Polish Notation (RPN),  commonly  used
        with the HP calculators.  Rather than give extensive examples, we
        will  assume  that you have used an RPN calculator at some  time,
        and just give a table of the elementary functions.

             WORD       FUNCTION                BEFORE   AFTER
             ABS       absolute value of top       B A    B |A|
                       of stack
             NEGATE    2's complement top          B A    B -A
                       of stack
             +         add top stack values        B A    B+A
             -         sub top stack values        B A    B-A
             *         mul top stack values        B A    B*A
             /         div top stack values        B A    B/A
             MOD       remainder of division     C B A    C R
                       of B/A
             MAX       top two numbers dropped,  C B A    C MAX(A,B)
                       larger one put back
             MIN       top two numbers dropped,  C B A    C MIN(A,B)
                       smaller one put back













        USING FORTH                                             Page 2-5


        An  example of the use of some of these functions is to  evaluate
        the expression

                               ABS [(5+4)/2 - 20]

        You would enter it with FORTH by

                  OK  5 4 + 2 / 20 - ABS . <cr>
                  16
                  OK

        Note  that  the division truncates because we are  using  integer
        arithmetic.


        2.4  Logical Operators


             The  logical  operators act upon all 16 of the  bits  in  an
        integer  and leave results which involve all those  bits.   There
        are  four basic operators,  three of which require two numbers on
        the stack and one which acts only on the top value:

                  NOT    one's complement of the top value.
                  AND    bitwise "AND" of the top two values.
                  OR     bitwise "OR" of the top two values.
                  XOR    bitwise exclusive OR of the top two values.


             The use of these definitions is most easily seen by using  a
        base which is a power of two.  The most common of these are octal
        and  hexadecimal.   This way there is an easily decoded relation-
        ship  between  the value of a number and the state of  its  indi-
        vidual bits.  Type

                  OCTAL <cr>

        FORTH is now ready to handle base 8.   Typing HEX would give base
        16,  and DECIMAL gives base 10.   Using base 8, an example of the
        logical operators is

                  OK 453 321 AND .  <cr>
                  1
                  OK

        where  the only bit in common between the octal numbers  453  and
        321 is the least significant bit.
















        USING FORTH                                             Page 2-6


        2.5  Relational Operators


             Relational  operators  compare  stack  values  and  leave  a
        logical  truth flag;   ie.,  a number that is either zero or  one
        depending  on  the tested condition.   All  relational  operators
        destroy  the stack values they test and just leave the truth flag
        on  the  stack.   There  are  many  of  these  operators  because
        condition  testing is one of the most common functions  performed
        in FORTH.  The table below lists the major relational operators.

             WORD                   FUNCTION
               0=       If the top stack value equals zero, leaves a 1
                        (true);  otherwise, leaves a 0 (false).  Also
                        called NOT.

               0<       True if stack value is less than 0, false
                        otherwise.

               0>       True if stack value is greater than 0, false
                        otherwise.

               <        True if the next lower stack value (B) is less
                        than the top stack value (A), false otherwise.

               =        True if B is equal to A, false otherwise.

               >        True if B is greater than A, false otherwise.


             An example of the use of some of these relational  operators
        is to compare

                  OK 8 0= 9 10 < = .  <cr>
                  0
                  OK

        The  number 8 is compared to see if it is equal to zero.   It  is
        not, so this operation leaves a 0 on the stack in place of the 8.
        Then 9 is tested to see if it is less than 10.   This is true, so
        a 1 is pushed on the stack.  Then the results of the previous two
        operations  (0 and 1) are tested to see if they are  equal.   The
        result is 0, which is then printed.  The stack is now empty.


        2.6  Forth Memory Allocation


             Before we go any further in examining FORTH, a little of the
        nuts  and  bolts  must be presented.   FORTH is  a  core-resident
        program that occupies approximately 24000 bytes of  memory.   Not
        all of the allocated memory is filled under normal use;  instead,
        it  is  partitioned  into subsections that can  expand  with  the
        increasing load.  The partitions are:









        USING FORTH                                             Page 2-7



        I.   THE DICTIONARY.  Nearly all of FORTH resides in the diction-
             ary.   The  dictionary  starts at about address 300  and  is
             composed of three contiguous sections:

             a.   Kernel.   Core locations 300 through 8000 (bytes)  hold
                  the  FORTH  kernel.   This  is  the  assembly  language
                  program  that  contains  the 190 most  primitive  FORTH
                  definitions; somewhat ignorant but easily teachable.

             b.   Basic FORTH.   This section is the SYSTEM  definitions,
                  some  200  elementary words that later definitions  can
                  draw on.

             c.   Application  FORTH.   In this area are the  definitions
                  for any program or utility that you load after starting
                  your session.  This area grows upwards to higher memory
                  locations.

        II.  THE  DATA  STACK.   The data stack contains  such  items  as
             arguments passed between routines, numbers typed in from the
             terminal,  system word temporary storage,  etc.,  and is the
             stack we previously talked about.  This stack is placed near
             the  top of the FORTH program,  and "grows" downward towards
             lower memory locations.

        III. THE  RETURN STACK.   Less used by the  beginning  programmer
             (for  good  reason!),  the return stack's primary use is  to
             contain  addresses  of  the words to  be  executed  when  we
             "return" from the word being currently executed.  Other uses
             include  storage for loop parameters,  and numbers that  are
             "in  the  way" on the data stack.   The return stack  starts
             near the top of the memory allocation and grows downward  in
             memory.  It is much smaller than the data stack (only 80 16-
             bit  locations),  so  use  it  sparingly  and  with  careful
             attention to the protocol.

        IV.  THE BLOCK BUFFERS.  UNIFORTH is a disk-based system and uses
             two  or  more  buffers to bring data to and from  the  disk.
             Each buffer is nominally 1024 bytes long.

        The  addresses  listed above are for a Z80  CP/M  system.   Other
        systems will have slightly different addresses.




















        USING FORTH                                             Page 2-8


             A diagram of how memory is allocated in core is shown below.

             high limit     |---------------------------|
                            |    block buffer 2         |
                            |---------------------------|
                            |    block buffer 1         |
                            |---------------------------|
                            | v                         |
                            | v       return stack      |
                            | v                         |
                            |---------------------------|
                            | v                         |
                            | v        data stack       |
                            | v                         |
                        ^   |   .   .   .   .   .   .   |
                        ^   |                           |
                        ^   |                           |
              memory    ^   |   .   .   .   .   .   .   |
             addresses  ^   | ^                         |
                        ^   | ^ user application        |
                        ^   | ^  dictionary             |
                            | ^                         |
                            |---------------------------|
                            |                           |
                            | "standard" FORTH          |
                            |     dictionary            |
                            |                           |
                            |---------------------------|
                            |                           |
                            |    FORTH kernel           |
                            |        dictionary         |
                            |                           |
             low limit      |---------------------------|



        2.7  Pointer Values


             FORTH  has  four  "pointers,"  most  of  which  are  usually
        transparent  to the user.   The two stack pointers  have  already
        been mentioned.   The data stack pointer can be referenced by the
        word  SP@,  which  indicates the address of the top of the  stack
        before  SP@ was used.   The return stack pointer's current  value
        can be obtained by the word RP@.

             The dictionary pointer (DP) indicates the first free  memory
        address  for  the storage of new definitions.   Its value can  be
        obtained by DP @ and can be changed by ALLOT,  which uses the top
        stack  value  as the number of bytes by which  to  increment  the
        pointer.   Further  explanation of the dictionary pointer can  be
        found in the User's Guide.











        USING FORTH                                             Page 2-9


             The   interpreter  pointer  (IP)  is  an  internal  register
        containing  the address of the next FORTH "word" to be  executed.
        It  cannot  be accessed by the programmer  except  with  assembly
        language  routines.   Some further information concerning the  IP
        can be found in the User's Guide.


        2.8  Definitions


             Now let's get back to our problem of squaring numbers.  What
        we discussed before leads into the next logical point:   it would
        be   convenient  to  take  a  series  of  stack  operations   and
        automatically call in the whole series when needed.  Consider the
        case of squaring a number, i.e., calculating A*A.

             You can define a word to perform this function for you. Pick
        a name for your word,  for example,  SQUARE.  You can define this
        word by

                  OK : SQUARE DUP * ;  <cr>


             The  first  thing  on the line is a word which is  just  the
        single  character  ":" (colon).   Following it (separated  by  at
        least one space) is the word name you are defining.   Next is the
        series of words you wish to have executed (DUP *).   Finally, the
        closing word is a semicolon,  which indicates that the definition
        of SQUARE is complete.   The word,  once defined, can now be used
        like any of the well-known words, i.e.

                  OK 5 SQUARE . <cr>
                  25
                  OK 3 4 + SQUARE 40 - . <cr>
                  9
                  OK


             Before  proceeding,  you  should stop and consider  what  is
        happening  in  more detail.   The process of putting a series  of
        words  together  in  a so-called  "colon  definition"  is  called
        "compilation".   When  FORTH  is  processing the words  inside  a
        definition,  it  does almost all the work needed to perform  your
        function.   When the word is used, FORTH can very rapidly perform
        the function you have designed.

             The  colon  starts  the compilation  process  by  using  the
        following  character  string  as  the "name"  of  what  is  being
        compiled.   The name is stored at the beginning of the definition
        in  the  "header section" as a count byte followed by  the  ASCII
        characters  of  the name.   The address of an  assembly  language
        routine  is next (the "code section") and then the information to
        be processed (the "parameter section"),  such as the addresses of
        the FORTH words to be included in your definition.   Finally, the









        USING FORTH                                             Page 2-10


        semicolon turns off the compilation process and gets you back  to
        the "interactive execution" mode you started with.  If you forget
        the semicolon, any words you type after it will be thrown in with
        the colon definition and not executed immediately.

             Remember  that the only restriction on names is that control
        characters  are  not allowed.   There is nothing sacred  about  a
        "number" such as "7".  If you want to be different you can define

                  :  7 5 ;

        and obtain such bizarre results as

                  OK 7 3 + .  <cr>
                  8
                  OK


             The next step in defining words is to realize that there  is
        no   distinction   between  "FORTH  words"  and   "your   words".
        Previously, you defined the word

                  :  SQUARE DUP * ;

        Using  this word you can define a routine to get the fifth  power
        of numbers like this:

                  :  **5 DUP SQUARE SQUARE * ;


             Now suppose you choose to redefine SQUARE.  You could choose
        to do this by typing

                  OK :  SQUARE DROP 5 .  ;  <cr> SQUARE Redefined
                  OK 7 SQUARE <cr>
                  5
                  OK

        Note the "Redefined" informative message that you get.   However,
        the  new  definition  of SQUARE will not affect its  use  in  the
        previously defined word, **5.

                  OK 2 **5 .  <cr>
                  32
                  OK

        But  if  **5 is now redefined,  the new definition of  SQUARE  is
        used.

                  OK :  **5 DUP SQUARE SQUARE * ;  <cr> **5 Redefined
                  OK 2 **5 .  <cr>
                  5 5 2
                  OK










        USING FORTH                                             Page 2-11



             The behavior is governed by these two rules:

             1.   When  you  define  a word,  all words used  within  the
                  definition must have been previously defined.

             2.   Later  changing a word you use within definitions  will
                  not  affect  words you have  already  defined  -- their
                  function  will  remain unchanged until you enter a  new
                  definition for the word.


             Notice  that only the most recent dictionary  definition  of
        words used within a colon definition will be used.   For example,
        in   subsequent  use,   the  correct  definition  for  SQUARE  is
        inaccessible  because another definition for SQUARE  was  created
        later.   There  is  a  way of "forgetting" the later  version  of
        SQUARE.  The FORTH word FORGET, used like

                  OK FORGET SQUARE <cr>
                  OK

        will erase from the dictionary the most recent definition of
        SQUARE and all definitions made after it.

             We  have mentioned colon definitions.   You can also  define
        machine  language words with the word CODE,  and terminate  their
        definition with the word END-CODE,  in a similar manner as  colon
        and semicolon.  We will mention machine language routines in more
        detail in a subsequent chapter.

             One  other item before we leave the subject of  definitions.
        Besides using RPN representation, FORTH is decidedly not FORTRAN-
        like   in  its  definitions.    Though  these  act  exactly  like
        subroutines, they differ in that most arguments are passed on the
        data   stack,   and  that  the  entire  definition   is   written
        horizontally.   While  you can write definitions with each called
        word  on a separate line,  it is not commonly done.   This can be
        confusing to the beginning programmer,  but think of it as if you
        were entering the line interactively.


        2.9  Constants and Variables


        FORTH  has several words for reading from and writing to  memory.
        To  read  from memory,  an address must be specified.   Then  "@"
        (pronounced "fetch") takes that address,  reads the 16-bit  value
        starting at that address,  and places it on the stack.   The word
        C@ accomplishes a similar task, except that it retrieves only the
        byte stored at the address, places it in the low byte of a 16-bit
        location or cell which is then placed on the stack.











        USING FORTH                                             Page 2-12


                              <<<CELL DEFINITION>>>

                       A cell is a 16-bit memory location.
                       The low order byte is stored at the
                       first byte address;  the high order
                       byte   is   stored   at   the  next
                       consecutive byte address.


        The  procedure  of  reading (or fetching as it is  more  commonly
        called)  and  then printing is used  often.   Therefore,  a  word
        exists that combines both of these operations--the question  mark
        (?).  It fetches an integer from a given address and prints it.

             Two words exist to write into a specific memory location. As
        for  reading,  the  exclamation point ("!",  pronounced  "store")
        stores a 16-bit value and C!   stores the low-order byte of a 16-
        bit  value from the top of the stack.   In both cases,  the  data
        value and the address are removed from the stack.  For example,

                                  16432 18500 !

        stores the values 16432 at address 18500.

             Also in the context of definitions, you can define constants
        and variables to be used in your programs.  Numeric constants can
        be defined with the word CONSTANT.  For example,

                  31415 CONSTANT PI-TIMES-10000

        defines  the FORTH word PI-TIMES-10000.   Whenever you type  this
        word, the constant 31415 will be pushed on the stack.

             Often  you find that it is awkward to have all your data  on
        the  stack at once.   You can store data in single  named  memory
        locations with the FORTH word VARIABLE.  For example,

                  VARIABLE Q

        defines the word Q.   When you type Q, the address of the storage
        location corresponding to Q is pushed onto the stack.  You cannot
        preset  this storage location during the definition as you  could
        with  CONSTANT.   You can use Q in conjunction with @ and  !   to
        change  the  contents  during program  execution  (for  instance,
        updating a counter).   There is a special word called tick,  "'",
        which  allows  the  changing of the value of  a  CONSTANT.   Tick
        places the address of a word's parameter field (where the  number
        is  stored for CONSTANT) on the stack.   You can then change  the
        value using "store".  For example,

                  31416 ' PI-TIMES-10000 !

        changes PI-TIMES-10000 from 31415 to 31416.










        USING FORTH                                             Page 2-13



        2.10  Typing


             One of the problems with FORTH as far as users are concerned
        is that there is no typing of variables.   That is, once you have
        defined  variable XXX,  the system doesn't know later whether XXX
        is an integer,  floating point number, or what.  The advantage of
        this  is  that  less  storage  space  and  compiler  overhead  is
        necessary,  and  as long as you are dealing with  characters  and
        integers, the inconvenience is small.

             The  disadvantage  comes into play when FORTH  becomes  more
        complicated,  and  you  start implementing types such  as  double
        precision integer,  string variables,  etc.  Because of this lack
        of typing, you cannot perform mixed-mode arithmetic automatically
        using a precedence scheme such as in FORTRAN.

             Therefore, when using FORTH, you must keep the type of every
        variable  and  stack  member in mind,  and  perform  the  correct
        operation on the numbers.  For example:

                +      Add the two top 16-bit stack values, assuming they
                       are single precision integers, and leave a 16-bit
                       result.

                D+     Add the four top 16-bit stack values, assuming
                       they are two double precision (32-bit) integers,
                       and leave a 32-bit result.

                F+     Add the four top 16-bit stack values, assuming
                       they are two single precision (32-bit) floating
                       point values, and leave a 32-bit floating point
                       result.

                SS*D   Multiply the two top 16-bit stack values assuming
                       they are single precision integers, and leave a
                       32-bit double precision integer result.

        In  other  words,  some  of the work has been taken  out  of  the
        compiler  or language and placed on the  programmer's  shoulders.
        There  is  no  inherent  reason why  a  typed-FORTH  couldn't  be
        created;  there just has been no emphasis in this direction.




















        USING FORTH                                             Page 2-14


        2.11  Control Structures


             Control   structures  allow  you  to  modify  program  flow,
        primarily by making decisions and causing various definitions  to
        execute within a colon definition.


        2.11.1  Looping


             Maintaining an iteration counter and causing a branch out of
        the  loop  when a preset value is reached is a  very  fundamental
        software feature.  FORTH provides the DO and LOOP words for this.

             When making a loop,  you usually know the starting value and
        the number of repetitions desired.   When you sum these,  you get
        the total.   DO expects to find two parameters on the stack,  the
        total and the starting value:

             [total] [start] DO [things to be done] LOOP


             As an example, consider a definition to print out 5 numbers.
        If we start with 1, then the total is 6, and our definition is:

                  :  PRINT_FIVE 6 1 DO .  LOOP ;  <cr>

        This definition expects to find 5 numbers on the stack.

                  OK 34 5 2 6 -3 PRINT_FIVE <cr>
                  -3 6 2 5 34
                  OK

             Other  languages use the starting value and the ending value
        as the loop limits,  and switch the order of the  limits.   These
        variances are  matters of preference.

             Often  it  is useful to have a word to access the  iteration
        counter, and FORTH provides several of them as indicated below.

             WORD                    FUNCTION
             I           Push the value of the iteration counter of
                          the innermost loop onto the stack.

             J           Push the value of the next outermost loop
                          counter onto the stack (i.e.,2 nested
                          loops).

             I-          Subtract the value of the innermost counter
                         from the value on the stack.

             I+          Add the value of the innermost counter to
                          the value on the stack.









        USING FORTH                                             Page 2-15




             Consider a loop to print the numbers from 1 to 10:

                  OK :  10_#'S 11 1 DO I .  LOOP ; <cr>

        When executed, 10_#'S will give

                  OK 10_#'S <cr>
                  1 2 3 4 5 6 7 8 9 10
                  OK


             Since  DO  expects to find the iteration parameters  on  the
        stack at execution time,  you can wait until then to define them.
        A general, ascending order, number printing routine might be:

                  OK :  GEN_ASC_ORD DO I .  LOOP ; <cr>

        When executed, this word expects to find the DO parameters on the
        stack:

                  OK 11 1 GEN_ASC_ORD <cr>
                  1 2 3 4 5 6 7 8 9 10
                  OK

             Since  one  normally thinks of these parameters  as  [start]
        [finish] rather than the order that DO prefers, and further since
        [finish] is often preferred over [finish+1], try this:

                  :  LIMITS 1+ SWAP ;

        The  1+ adds 1 to [finish] and SWAP puts [start] and [finish]  in
        the correct order for a DO.   In other words,  you have created a
        "preprocessor"  for  DO-LOOPS.   This is rarely  done  with  most
        languages,  but  if  you  expect  to use this  a  few  times  the
        convenience pays off in FORTH.

                  OK :  GEN_#_PRINT LIMITS DO I .  LOOP ; <cr>

        In use, this gives:

                  OK 1 5 GEN_#_PRINT <cr>
                  1 2 3 4 5
                  OK


















        USING FORTH                                             Page 2-16


        2.11.2  Conditional branching


             Conditionals traditionally allow some value to be tested and
        a  branch to occur based upon the test.   FORTH  allows  one- and
        two-sided conditional branches.

             The  IF word and the THEN word are the simplest  cases.   IF
        will  cause  the  definitions  between it  and  THEN  to  execute
        provided  the top stack value (TOS) is logical true  (or  really,
        not  equal  to zero).   If the TOS is zero,  FORTH will  skip  to
        execute the words following the THEN word.  For example,

                  OK :  USE_IF IF 1 .  THEN 2 .  ;  <cr>

        When executed, this definition will give

                  OK 1 USE_IF <cr>
                  1 2
                  OK 0 USE_IF <cr>
                  2
                  OK

        IF always removes the logical quantity it tests from the stack.

             Another word,  ELSE, allows one of two branches to be taken.
        As an example:

                  OK :  USE_ELSE IF 1 .  ELSE 0 .  THEN ;  <cr>

             If 0 is on the stack,  the ELSE-clause will be executed;  if
        a  number other than 0 is on the stack,  the TRUE-clause will  be
        executed, as in

                  OK 0 USE_ELSE <cr>
                  0
                  OK 4 USE_ELSE <cr>
                  1
                  OK

        The ELSE portion executes if TOS is false, or 0.  In either case,
        the  definition after THEN executes.   In the preceding  example,
        the compiler operator ";" will execute.   It will signal both the
        end of the definition at compile time, and perform house-cleaning
        at the end of the definition at execute time.


















        USING FORTH                                             Page 2-17


        2.11.3  Block structure branching


             FORTH also provides a block structure which is essentially a
        loop without an iteration counter.  It is of the form:

                  BEGIN [good stuff] [flag] UNTIL

             BEGIN  is  a  place holder and marks the  beginning  of  the
        block.   UNTIL tests for a true or false TOS, and if false trans-
        fers  back to the word following BEGIN.   If true,  the word fol-
        lowing UNTIL will execute.   UNTIL will remove its logical  quan-
        tity from the stack.


        2.12  And so Forth....


             You  now have seen most of the basics of FORTH,  along  with
        some  examples.   The best way to learn more at this stage is  to
        sit at a terminal and practice!










































        USING FORTH                                             Page 2-1





                                    Chapter 3

                           UNIQUE FEATURES OF UNIFORTH


                As  mentioned  earlier,  the Sampler is a subset  of  our
        commercial FORTH.  Even so, it has many additions to the FORTH-83
        standard.  This chapter will mention a few of those features.  We
        recommend  the  purchase  of  the UNIFORTH Manual  Set  for  more
        information.


        3.1  Files


             UNIFORTH uses DOS 2 tree-structured files.   In other words,
        you can access files in any directory on any disk from inside  of
        UNIFORTH.  The limitation is that the file pathname cannot exceed
        63 characters.

             When  first  invoking  UNIFORTH,  you  have  the  option  of
        including  a  file  name on the same line.   If no  name  follows
        UNIFORTH,  then file FORTH.FTH will be  opened.   Otherwise,  the
        passed file will be opened.  For example,

                       UNIFORTH TEST.BIN

        will  open file TEST.BIN for access after the coldstart procedure
        is completed.

             All UNIFORTH source code filenames have an extension of .FTH
        for unique identification.

             The following words give the basic file access functions:

             CHANA,CHANB
                  There  are  two default "channels" for file  access  in
                  UNIFORTH,  selected by the words CHANA and CHANB.  When
                  first  invoking UNIFORTH,  CHANA is assumed.   After  a
                  channel has been selected, all file read/write commands
                  are  directed  to that channel.   If  you  now  specify
                  CHANB,  all  commands are directed to the file open  on
                  that channel.

             MAKE-CHAN <name>
                  If  you  want more files to be open  concurrently,  you
                  might  want to add channels.   This word will create  a
                  new word like CHANA that,  when executed, switches file
                  commands  to a new channel.   Each channel occupies  64
                  bytes  of  dictionary  space in addition  to  the  word
                  header.









        UNIQUE FEATURES OF UNIFORTH                        Page 3-2



             OPEN <fname>
                  Open the file.   If the file doesn't exist, you will be
                  prompted for its creation.   If you decline to create a
                  new file, the previous file will be reopened.

             CLOSE
                  Close  the file on the current channel.   No action  is
                  taken if a file is not currently open.

             MAKE <fname>
                  You can explicitly create a file with this word.   MAKE
                  and OPEN only create the DOS directory entry;  the file
                  has  no length until you explicitly write data  to  it.
                  Also,  until you close the file,  DOS does not know the
                  file's length.

             DELETE <fname>
                  Deletes the file.

             FILESTATUS
                  Displays information about the currently open file.

             Once opened, a file can be accessed in one of two ways:

             (1)  As  a block-oriented (FORTH) file.   You read/write  to
                  the file using 1024-byte random-access blocks of  data.
                  Common words are BLOCK, BUFFER, UPDATE, LOAD, etc.

             (2)  As a sequential, text-oriented file.  You read/write to
                  the file in bytes or lines,  where a line is terminated
                  with  a  CR/LF pair of ASCII characters.   This is  the
                  kind of file created by EDLIN or WORDSTAR.

             Block-oriented  files are the most straightforward.   All of
        the  FORTH-83  read/write/load words work on  block  files.   The
        limitations are that you will get an error message if you try  to
        access data beyond the end of the file,  and that you cannot load
        block  0  of any file.   You can also open and read binary  files
        such as UNIFORTH.COM with BLOCK, and dump their contents.

             A blank file can be created,  or a current file extended  in
        length,  using  the word EXTEND.   It has the number of blocks to
        extend as its argument.   Each added block is blank-filled with a
        ";S" at the beginning.


















        UNIQUE FEATURES OF UNIFORTH                        Page 3-3


             You can move blocks from one file to another with a brace of
        words:

             n1 n2 COPYATOB
                  Copy  block n1 of the file currently open on channel  A
                  into block n2 of channel B.


             n1 n2 #blks MCOPY
                  Copy #blks starting at block n1 in channel A to channel
                  B, starting at block n2.

             Text files are read byte-by-byte.   You should not use BLOCK
        on a text file, as there is no guarantee that the file will be an
        exact multiple of 1024 bytes in length (meaning you won't be able
        to access the last part of the file).  Instead, there is a set of
        words to perform the major read/write operations for you.

             RDBYTE char
                  Read one byte from the current file.  If the end of the
                  file  is  reached,  leave a true flag in place  of  the
                  character.

             adr cnt handle READ-BYTES nchar
                  Read  several  bytes  from a file into a  buffer  (like
                  EXPECT).   Leave on the stack the number of  characters
                  actually read, or 0 if an eof was detected.

             adr cnt RDLINE nchar
                  Read a "line" from the file into a buffer.   The number
                  of  characters actually read (nchar) will be less  than
                  cnt if a CR/LF is detected.

             char WRBYTE
                  Write the character to the current file.

             adr cnt handle WRITE-BYTES nchar
                  Write  cnt  characters  to  the  file  pointed  to   by
                  "handle".   nchar  is  the actual number of  characters
                  written,  and will be less than cnt only if the disk is
                  full.

             adr cnt WRLINE
                  Write  cnt characters to the current  file.   Append  a
                  CR/LF pair to terminate the line.

             WREOF
                  Write an end-of-file mark on the current file.















        UNIQUE FEATURES OF UNIFORTH                        Page 3-4


             d1 meth handle !FILE-POS d2
                  A   method  of  random-access  on  a  sequential  file.
                  Position  the  next read/write to byte d1 of  the  file
                  pointed  to  by handle.   The position  method  can  be
                  absolute (0),  relative (1) or past the end of the file
                  (2).  d2 is the new location of the file pointer.

             handle @FILE-POS d1
                  Returns  the current file pointer (double integer bytes
                  from beginning of file).

        The  "handle" on some of these words is the MSDOS handle  number.
        It is returned when you open a file.   The current channel's name
        is pointed to by variable FCB, and the first byte of that name is
        the handle.   For example, to get the handle for the file open on
        channel A:

                  CHANA FCB @ C@

        will do the trick.

             You  can  also  load source code  from  a  text  file.   For
        example,  you might like to use FRED as a basic text editor,  and
        feel  restricted by the 12x64 format of a FORTH block.   You  can
        create a text file and load the entire file:

             TLOAD
                  Load  the  currently  open text file  starting  at  the
                  current file pointer.  Each line of text is interpreted
                  just  as if you had entered it from the  console.   You
                  must terminate the file with a ;S.

        Loading  from  a  text  file requires a  minimum  of  three  disk
        buffers, so check #BUFF before you attempt a load.


        3.2  Vectored I/O


             UNIFORTH  permits up to three input devices and five  output
        devices to be used for console I/O.  These devices are controlled
        by  the low-order byte of variable IOBYTE.   Each bit is assigned
        to  a  particular  input  or  output  device.    By  setting  the
        appropriate bit,  you can send output to 5 devices simultaneously
        or select an alternate keyboard.


















        UNIQUE FEATURES OF UNIFORTH                        Page 3-5


             A 16-byte table is located at IOBYTE+2.   The bits in IOBYTE
        select from these 8 addresses to execute the proper routine.  The
        bit definitions are:

                  bit#      IOTAB+...      routine
                  0         2              PC-specific input
                  1         4              console input
                  2         8              user specified input routine
                  3         10             user specified output routine
                  4         12             console output
                  5         14             disk output
                  6         16             printer output
                  7         18             PC-specific output

                            20             PC-specific status
                            22             console status
                            26             user specified status

        For  example,  to select console input and  printer  output,  you
        would  set  IOBYTE to 42H.   You can insert your own routines  in
        this table, with restrictions.  Check the Professional Manual Set
        for more information.

             We've defined a set of words to account for the most  common
        combinations:

                  TERMINAL       select PC input and output
                  PRINTER        select printer output only
                  +PRINTER       add printer output to current selection
                  +DISK          add disk output to current selection

        The  disk output is very restricted.   You must have a text  file
        open  on  channel B.   All terminal output is then stored on  the
        text file (a log file if you will).


        3.3  Numeric input


             The  UNIFORTH  Sampler  supports  three  basic  data  types:
        single  precision (16-bit) integers,  double  precision  (32-bit)
        integers, and single precision (32-bit) floating point.

             When  entering  a number from the keyboard,  you  must  tell
        FORTH  what  type  of  number it is  to  convert.   Since  16-bit
        integers are the default,  you need only enter the digits with an
        optional  +  or - sign at the beginning.   For  32-bit  integers,
        include a comma anywhere within the number.   For floating point,
        include a period anywhere within the number, with an optional "E"
        style exponent.  Examples:













        UNIQUE FEATURES OF UNIFORTH                        Page 3-6


                  string         converted as:
                  235            16-bit integer
                  23,5           32-bit integer
                  235.0          floating point
                  2.35E2         floating point

        All values convert to 235.   Variable PRECIS tells you what  kind
        of  number  was  last  converted  (-1=none,  0=16-bit,  1=32-bit,
        2=floating point),  and variable DPL locates the decimal point or
        comma within the number.


        3.4  Video editor


             We've  included our "slow" video editor as part of the basic
        system.   It  comes preconfigured for the IBM PC,  and uses  only
        BIOS calls to perform its duties.   We suggest that clone  owners
        try  this editor as-is before attempting any  modifications.   At
        worst, the screen will be filled with garbage characters, and you
        can  exit  the  editor  at  any  time  with  ctrl-X  without  any
        modifications  being written to disk (or ESC if changes are to be
        written).

             To enter the editor,  just use "n EDIT" where n is the block
        number to be edited.   If you were attempting to load a block and
        ran  into  an error,  and received the  block/line  number  error
        message,  the word WHERE (no arguments) will enact the editor and
        display  the  erroneous  code.   UNIFORTH  automatically  selects
        between the monochrome and the color graphics cards,  and between
        old  and new PC's,  so the editor should work without problem  on
        almost every system.

             Once  inside  the  editor,  the commands  are  pretty  self-
        explanatory.  All commands are mnemonic related and are displayed
        at the top of the screen.   The line stack is a temporary holding
        area  that  can  be  used to transfer lines  from  one  block  to
        another.   Jump  block will position the cursor at the  displayed
        block number; overtype it with the block you wish to move to.

             If   you  wish  to  customize  the  editor,   look  at  file
        VEDITOR.FTH.   It  contains configuration blocks for three  other
        popular terminals:   the ADM3/5,  the H-19 and the  VT-100.   The
        UNIFORTH  Professional  version includes about 10  more  terminal
        types.  However, this basic selection will cover 95% of all clone
        cases.   Find  the  terminal type that most closely matches  your
        system  and  load  the  appropriate  block.   This  modifies  the
        vectored editor words that are terminal specific.















        UNIQUE FEATURES OF UNIFORTH                        Page 3-7


             In  addition,  all control codes are defined  as  constants.
        You  may  wish  to use another key (such as  a  WordStar  layout)
        instead  of  what we've selected.   Just modify  the  appropriate
        parameter   and   menu  item  from  VEDITOR.FTH  and   load   the
        configuration block.

             When you've made all of the necessary changes, resysgen your
        system to save the modifications.


        3.5  SYSGEN


             UNIFORTH permits the storage of a precompiled system,  to be
        later executed in a similar manner as UNIFORTH.COM.   You may add
        anything  to the system that you want;  make patches to the basic
        system;  delete  earlier utilities like the  high-level  floating
        point  functions;  and then save the new task image onto  another
        file.

             The SYSGEN utility is in file FORTH.FTH.   You will find two
        words most useful:

             REALLOCATE
                  This  word  prompts you for two pieces of  information:
                  the  number of disk buffers and the  memory  size.   We
                  recommend  3  buffers.   If you have more than 64Kb  of
                  user program space on your system (that is,  more  than
                  about 96Kb of total memory),  you may be tempted to use
                  a  number  larger than 64 when asked for  memory  size.
                  The  UNIFORTH  Sampler is limited to 64K,  and so  will
                  truncate  any  answer  you give  to  fit  within  those
                  constraints.

             SYSGEN
                  The main word.   After you have used reallocate, sysgen
                  will  save  the compiled image onto a task  file.   You
                  specify the file name.

             SCRAMBLE
                  If you wish to distribute a commercial application  and
                  don't  want  the user to have any access to  FORTH,  we
                  recommend  the  use of the  word  SCRAMBLE.   It  first
                  destroys  the word links,  then executes  SYSGEN.   The
                  resultant  compiled task image will not be able to find
                  enough words in the dictionary to make effective use of
                  FORTH,  yet your later application words will still  be
                  available.















        UNIQUE FEATURES OF UNIFORTH                        Page 3-8


        3.6  Assembler


             Included  in UNIFORTH.COM is an assembler that uses the 8086
        mnemonics.   This assembler is essential in defining some of  the
        basic words of the system, and uses some 3K bytes of storage.

             You have full access to this assembler for your own use and,
        in fact, are highly encouraged to use it.  FORTH machine language
        definitions are extremely easy to create and debug, compared with
        other  languages.   It  is ideal for learning how to  program  in
        machine language, or to test out various algorithms before incor-
        porating them in other programs.

             Machine language FORTH words are created by using one of the
        defining words CODE or SUBROUTINE.  In each case, the interpreta-
        tion state is changed from compilation (i.e.,storing the  addres-
        ses  of routines into a definition) to execution (executing  each
        word as it is encountered).  The words executed are 8086 opcodes,
        which  use stack parameters to create 8086 instructions which are
        then stored into the definition.


        3.6.1  Creation of Code Words


             To create a machine-language word callable from other  FORTH
        words,  use CODE,  just like you would the defining word "colon".
        For example,

             CODE DUP  DX POP,  DX PUSH,  DX PUSH,  NEXT,  END-CODE

        which  creates  a  code word called DUP that pops the  top  stack
        value  into the register DX,  then pushes it back on  twice.  The
        last  statement  in  a CODE definition must  be  END-CODE,  which
        cleans up the stack and returns the user to the FORTH vocabulary.

             The word NEXT, is one of the three required ways of termina-
        ting the actual word definition if the new word is to be callable
        from other FORTH words.  The three ways are:

                  NEXT,     Jump  to the interpreter to pick up the  next
                            word to execute.

                  APUSH,    Push  the  contents of AX onto the stack  and
                            then jump to the interpreter (go to NEXT).

                  DPUSH,    Push the contents of DX onto the stack,  then
                            push AX, and finally go to NEXT.














        UNIQUE FEATURES OF UNIFORTH                        Page 3-9



             A  defining  word called SUBROUTINE is available  to  create
        machine-language  words  to  be used only  within  other  machine
        language words (using CALLs or JMPs).  For example,

             SUBROUTINE 4*  AX AX ADD,  AX AX ADD,  RET,  END-CODE

        creates  the  word 4* that will multiply AX by 4.   To  use  this
        word:

             CODE 64*  AX POP,  4* CALL,  4* CALL,  4* CALL,
               APUSH,  END-CODE

        will multiply the top stack value by 64.   Remember:   you cannot
        directly execute 4* as defined in this way.  For example,

             : 64*  4* 4* 4* ;

        will leave three copies of the PFA of 4* on the stack, instead of
        performing the desired multiplication.

             The  data  stack is accessed by the "PUSH," and "POP,"  8086
        instructions.   All FORTH return stack operations are not  easily
        accessible from inside CODE words.   Also,  because push, pop and
        call  use  the  data stack,  you must be careful on how  to  pass
        arguments  to subroutines as the arguments to be passed  will  be
        covered  up by a "call" type statement unless you first pop  them
        into registers in the calling routine.

             The 8086 registers are assigned by UNIFORTH as follows:

                  AX   general purpose register
                  BX   general purpose register, also used by NEXT
                  CX   general purpose register
                  DX   general purpose register
                  DI   general purpose register
                  SI   the interpreter pointer, IP
                  BP   the FORTH "return stack", RP
                  SP   data stack pointer
                  CS   segment register.  Must be preserved
                  DS   segment register.  Must be preserved
                  SS   segment register.  Must be preserved
                  ES   temp seg register.  Only used by a few words.

        Any register labelled as general purpose can be used at any  time
        by  any word.   Other registers can be used by the programmer  if
        their contents are saved and restored.   DX is only used by ;CODE
        and  can generally be used by the programmer as a general purpose
        register.  DI may be used in future versions for storing the user
        area pointer, so use it with caution in your applications.













        UNIQUE FEATURES OF UNIFORTH                        Page 3-10


             Here are some other points that may save you some grief.  As
        shown  in  the  register assignment table,  SI is  used  for  the
        interpreter  pointer.   String operations such as MOVS use SI  as
        the  source address register.   Remember to save SI,  perform the
        operation,  and then restore SI.  The UNIFORTH Sampler sets all 4
        segment  registers equal.   You should therefore set DS=ES on all
        string operations by a sequence similar to:

                       DS AX MOV,
                       AX ES MOV,

        (you can't MOVe directly between segment registers).   The  inner
        interpreter,  NEXT,  assumes  that  the direction flag  has  been
        cleared.  If you use STD in a word, be sure you reset it with CLD
        before jumping to NEXT.

             The opcode mnemonics used in the assembler are basically the
        same as used by Intel, except:

             1.  All instructions are reverse-polish.  For example,

                           Intel:  MOV CL,AH

                           FORTH:  AH CL MOV,


             2.   All instructions have a trailing comma.  This indicates
                  that something is being stored in the dictionary by the
                  instruction,  and also prevents multiple definitions as
                  would be the case for XOR.

             3.   The calls,  unconditional jumps,  and returns have been
                  divided into intrasegment versions (CALL, JMP, RET) and
                  "long" intersegment versions (LCALL,LJMP,LRET).

             4.   The normal prefixes such as LOCK,  SEG, REP, BYTE, WORD
                  are  coded  without  any suffixed  comma.   All  string
                  operations assume byte mode unless overridden.

             5.   The assembler is definitely not user-proof.   The  only
                  error  checking  is for removal of all items placed  on
                  the stack during the definition (i.e.,  loops and bran-
                  ches properly terminated).  You, as the programmer, are
                  responsible   for   knowing  proper   usage   of   each
                  instruction.


















        UNIQUE FEATURES OF UNIFORTH                        Page 3-11


                                    NOTATION

        reg       any of the registers as appropriate
        cc        condition codes such as Z,NZ,CY,NC,GT,LT,LE,MI
        data      an 8-bit integer
        data16    a 16-bit integer
        addr      a 16-bit address
        addr32    a 32-bit address
        disp      a signed 8-bit displacement
        disp16    a signed 16-bit displacement


        Addressing modes:

             Intel                     FORTH
             MOV  AX,BX               BX AX MOV,
             MOV  AX,[DI]             [DI] AX MOV,
             MOV  AX,[BP+4]           4 [BP+] AX MOV,
             MOV  AX,[BP+DI]          [BP+DI] AX MOV,
             MOV  AX,[BP+DI+4]        4 [BP+DI+] AX MOV,
             MOV  AX,[4000]           4000 ) AX MOV,
             MOV  AX,32               32 # AX MOV,

        Instruction Specifics:

             Intel                    FORTH
             CALL addr32              addr32 LCALL,
             CALL disp16              addr CALL,
             REP BYTE CMPS            REP BYTE CMPS,
             ESC mem                  mem ESC,
             IN AX,32                 32  AX IN,
             INT  21                  21 INT,
             JMP addr32               addr32 LJMP,
             JMP  disp                addr JMP,
             LOOP disp                addr LOOP,
             RCL  AX,1                1 # AX RCL,
             RET disp16               disp16 RET,
             RET disp16               disp16 LRET,
             SEG  ES                  ES SEG,

        where  addr  is the actual address to which you  want  to  branch
        (UNIFORTH calculates the appropriate offset).





















        UNIQUE FEATURES OF UNIFORTH                        Page 3-12


        13.6.2  Conditional Branching


             Several  branching structures have been included as in  high
        level FORTH.   You can use IFs and BEGIN-UNTIL loops, in addition
        to hard branching with JMP-style opcodes.

          cc IF,       Start a forward branch.   cc is the 8086 condition
                       code  to be satisfied.   (Actually,  IF,  codes  a
                       conditional jump of the opposite sense of cc).

          ELSE,        The branch for the case when the condition code is
                       not satisfied.

          THEN,        Termination of an IF, statement.

          BEGIN,       Start of a block structure.

          cc UNTIL,    Branches back to BEGIN, until cc is satisfied.

          cc WHILE,    Executes   statements   following  while   cc   is
                       satisfied.

          REPEAT,      End of a BEGIN, WHILE, sequence.

          DO,          Mark  the  beginning of a DO-LOOP.   Identical  to
                       BEGIN,


        In each case of a conditional testing instruction,  you must have
        set  or tested the condition codes before the instruction  execu-
        tion.   For example,  for 'NZ IF,' you could have executed 'BL AH
        CMP,' before the IF, to set the condition codes.  Also, since the
        conditionals  use the Intel conditional  jump  instructions,  all
        branching must be less than 128 bytes in length.


        3.6.3  Examples


             Some of the best examples of CODE words can be found in your
        library  disk.   Listed  below  are three simple  examples  as  a
        further guide.

             For  more help in programming the 8086,  we highly recommend
        the purchase of The 8086 Book, by Russel Rector and George Alexy,
        Osborne  Press,  or The 8086 Primer,  by  Stephen  Morse,  Hayden
        Press.















        UNIQUE FEATURES OF UNIFORTH                        Page 3-13


        Example  1.   Incrementing  the top stack value by the amount  in
        variable INCREASE.

             VARIABLE INCREASE         ( initial value)
             2 INCREASE !

             CODE BUMP                 ( define BUMP)
                 AX POP,               ( pop stack value into AX)
                 INCREASE ) DX MOV,    ( get increment into DX)
                 DX AX ADD,            ( add together)
                 APUSH,                ( put total back on stack)
                 END-CODE

        Example  2.   Adding  or subtracting 1 from the top  stack  value
        depending on whether it is positive or negative respectively.

             CODE BIGGER               ( define BIGGER)
                  DX POP,              ( pop stack value into DX)
                  AX AX XOR,           ( clear AX)
                  DX AX CMP,           ( is value negative)
                  LT IF,               ( if LT, yes)
                  AX DEC,              (   so then subtract)
                  ELSE,                ( if not GT, then...)
                  AX INC,              (   increment)
                  THEN,                ( now end)
                  APUSH,               ( by pushing AX onto stack)
                  END-CODE

        Example 3.   Using a DO-LOOP construct with DO and LOOP.  Shift a
        byte left n times.

             CODE LSHIFT               ( define LSHIFT)
                  CX POP,              ( get count)
                  AX POP,              ( byte to shift is now in AL)
                  DO,                  ( start of loop)
                  1 # AL ROL,          ( rotate left one bit)
                  LOOP,                ( continue until CX=0)
                  APUSH,               ( put rotated value back
                  END-CODE             (   on stack and end)



        3.7  Segment Utility

             A  short  utility  can be found  in  FORTH.FTH  that  allows
        reading  and writing of data into the entire 1Mb address space of
        the  8088.   The  utility can use either long  (32-bit)  absolute
        addresses (in which case, the words are prefixed with an "L"), or
        segment/offset addresses (words prefixed with "SEG").














        UNIQUE FEATURES OF UNIFORTH                        Page 3-14


             seg adr SEG@ n
                  Fetch the 16-bit value located at seg:adr.

             seg adr SEGC@ n
                  Fetch the 8-bit value located at seg:adr.

             n seg adr SEG!
                  Store the 16-bit value n at address seg:adr.

             n seg adr SEGC!
                  Store the 8-bit value n at address seg:adr.

             seg1 adr1 seg2 adr2 cnt SEGCMOVE
                  Move cnt bytes from seg1:adr1 to seg2:adr2.   Count has
                  a maximum value of 64K-max(adr1,adr2).

             dadr L@ n
                  Fetch the 16-bit value located at address dadr.

             dadr LC@ n
                  Fetch the 8-bit value located at address dadr.

             n dadr L!
                  Store the 16-bit value n at address dadr.

             n dadr LC!
                  Store the 8-bit value n at address dadr.

             dadr1 dadr2 cnt LCMOVE
                  Move cnt bytes from dadr1 to dadr2.   Cnt has a maximum
                  value of 64K.

             MYSEG val
                  Leave  on the stack the current segment number for  the
                  code space (that is, CS).

             dadr ADR>SEG seg adr
                  Convert the 32-bit address into a segment number and  a
                  16-bit offset.

             seg adr SEG>ADR dadr
                  Convert the seg:adr address into a 32-bit address.


        3.8  Deviations from FORTH-83


             We've sold FORTH-79 systems for years, but took 18 months to
        decide to revise UNIFORTH to match the FORTH-83 Standard.   There
        has been a lot of controversy about F83, with good reason.













        UNIQUE FEATURES OF UNIFORTH                        Page 3-15


             The primary problem is that FIG-FORTH and F79 programs  will
        not  run  under F83.   The Standards committee changed the  basic
        function of several words,  but kept their names the same.   This
        means that the wealth of published FORTH software is not  useable
        without recoding, so beware!

             UNIFORTH closely follows F83 with some exceptions.   Primary
        amongst  these is the F83 requirement of floored division.   What
        this  means  is  that integer truncation is  to  the  next  lower
        number.   Dividing  -14  by 10 yields -2,  since  the  fractional
        result   is   -1.4.    This  type  of  truncation   makes   sense
        mathmatically  but  doesn't match your natural thinking  nor  the
        currently available hardware.   All 8086,  68000,  PDP-11, Z8000,
        etc.  processors  use  arithmetic where the result  is  truncated
        towards zero.   Our example would then yield -1 as the result.

             Another  problem  is in handling the sign of the  remainder.
        If you divide -14 by 10, is the remainder -4 or +4?  F83 requires
        that  the  result by +4 (taking the sign of  the  divisor).   All
        processors give remainders that use the sign of the dividend,  or
        -4 in our example.  Again, UNIFORTH conforms to the hardware, not
        the Standard.

             We've  left  many  words "immediate" (such  as  ."  and  all
        vocabulary names).  F83 uses separate words for execution and for
        compile.    F83's  UM*  is  UNIFORTH's  USS*D,   where  our  form
        explicitly  tells  what  kind of mixed mode arithmetic  is  being
        used.

             We're  not happy about the -1 truth flag.   While  it  makes
        sense logically,  it makes error checking more difficult.  Beware
        of F79 and FIG-FORTH uses of the truth flag!

             The  Programmer's Guide gives information on how to  convert
        FIG-FORTH and F79 systems to UNIFORTH.

             There  is  much  more  about the Sampler  that  hasn't  been
        discussed here.   Explore the system!  You may find features that
        are of use.   The Manual Set describes the UNIFORTH  Professional
        in  gory detail,  so you might take a look at it if you need more
        help.






















        UNIQUE FEATURES OF UNIFORTH                        Page 3-1




                                    Chapter 4

                              WHAT YOU ARE MISSING


             Now that you have used UNIFORTH,  you might be interested in
        how the Professional differs from the public domain Sampler.   We
        recommend  writing  for our free,  complete catalog,  but  listed
        below are some of the major differences in more technical detail.

        Multitasking
             The Professional is a fast multitasking system.   Tasks  can
        be assigned priorities,  and messages can be passed between them.
        Each  task  takes less than 1K bytes of memory,  so many  can  be
        resident  at once.   We often build systems that include the user
        task,  a  printer spooler,  a temperature background  acquisition
        task,  and  a  telecommunications task,  where all  four  are  in
        operation at once at no noticible degradation in response.

        Speed
             We've carefully optimized the Professional and use state-of-
        the-art  threading techniques to make the fastest possible  FORTH
        system.   The  floating  point routines use a separate stack  for
        fastest calculations.   You will find a 50% or larger improvement
        in speed.

        Strings
             A full string package is included.   All the functions  that
        you would find in BASIC,  such as MID$ and INSTR, are included so
        that you can manipulate strings as easily as integers.

        Custom utilities
             The IBM PC Professional UNIFORTH includes files of functions
        to access the keyboard, provide full musical note generation, and
        to  draw  lines,  dots and filled polygons on the color  graphics
        board.  In addition, every DOS2 system request is implemented.

        The fast video editor
             An  improved  video editor is included,  that  accesses  the
        video memory directly.   Screens appear as fast on the screen  as
        your  disk access will let them.   Extra functions such as multi-
        file editing,  line split and paste,  and adding blank blocks are
        included.

        Source code
             You get the source code to everything except the 5Kb kernel.
        In all, about 400Kb of source code is distributed.

        Debugger
             The  Professional  comes with a single-step  debugger/tracer
        that can be used to track down errors in your code.  The data and
        return  stacks  are displayed as each word  is  executed.   Break









        WHAT YOU ARE MISSING                               Page 4-2


        points may be set.

        Decompiler
             A  complete decompiler will display any high-level  UNIFORTH
        word on your screen.   This utility is highly useful to check the
        syntax of a word or to retrieve an interactive definition.

        More systems
             The   Professional   UNIFORTH  is  available  for  a   dozen
        processors and even more operating systems.  We will customize it
        for  a particular computer,  create stand-alone systems  and  add
        multi-user support as desired.

        Floating point
             Both hardware and software floating point is included.   The
        hardware  floating  point uses the 8087,  gives both  single  and
        double precision capability,  and provides some really impressive
        speed gains.   Of course,  all opcode extensions to the assembler
        are included.

        Documentation
             The   UNIFORTH  Professional  comes  with  500+   pages   of
        documentation in a custom slipcase/binder.   All aspects of FORTH
        are covered,  from a tutorial much like the one in this manual to
        detailed   discussions   of   threading   techniques,    database
        management,  forms generation,  coding conventions and much more.
        Numerous examples are included to speed the learning process.

        Support
             You get 90 days of free hotline support.  Additional support
        is also available.   We offer on-site classes.   The Professional
        is offered with a 30-day money-back guarantee.

        Cross-compilers
             The  UNIFORTH cross-compiler requires the Professional,  and
        supports many microprocessor targets.

             For  complete  information,  write  for  the  free  UNIFORTH
        catalog.   If  you  just wish to order an MS/PCDOS  version  that
        corresponds to this Sampler,  then use the catalog numbers listed
        below.

        Cat #          Computer                      Price
        M22       Generic MSDOS 2.x                  $245
        M22P      IBM PC/XT/Jr DOS 2.x               $245
        M22T      TI Professional MSDOS 2.x          $245
        M22R      Rainbow 100 MSDOS 2.x              $245
        M22A      IBM PC/AT 80286 specific DOS 3.x   $295















        WHAT YOU ARE MISSING                               Page 4-3


        Other items of interest are listed below.

        Cat #          Sampler version               Price
        S21Z      Z80 CP/M 2.2                       $35
        S21P      IBM PC DOS 2.x                     $35
        S21A      Apple // (ProDos, 80col)      coming soon
        S21C      Commodore 64                  coming soon
        S21M      Macintosh                     coming soon

        Cat #          Item                          Price
        BK01      UNIFORTH Manual Set                $60
        BK11      Starting FORTH/Brodie              $17.95
        BK12      Thinking FORTH/Brodie              $15.95


        Ordering information:

             Specify your computer type and your disk format.   All items
        are sent post-paid by UPS or First Class within the U.S.  Checks,
        CODs,  money  orders  and purchase orders  in  U.S.  dollars  are
        accepted.  Maryland residents add 5% sales tax.  Prices are valid
        as of April 15,  1985 and may be different if ordering much later
        than that date.  Make checks payable to:

                            Unified Software Systems
                                  P.O. Box 2644
                            New Carrollton, MD 20784
                                 (301) 552-9590


        Conclusions

             We  hope  that you have enjoyed using the UNIFORTH  Sampler.
        It is a complete FORTH system that will provide you many years of
        usefulness.   Please, let us know your impressions.  Did you find
        FORTH worthwhile?   Are there bugs in this system?  What features
        would  you  like to see?   Its through user input  and  community
        discussion that FORTH will grow or die.  Cast your vote!

























ommunity
        discussion that FORTH will grow or die.  Cast your vote!

WORDS.DOC









                                   Appendix A

                            UNIFORTH VOCABULARY LIST



             Listed on the next pages are definitions of all of the words
        available  to  the user after invoking UNIFORTH.   The words  are
        presented  in alphabetical order.   The first line of each  entry
        consists of a symbolic description of the action of a  word,  the
        interpreter characteristics, the level of word's standardization,
        and the word's pronounciation.

             The  word action is shown in abbreviated form  by:   symbols
        representing input parameters,  three dashes for the word  place-
        ment,  and  any parameters that might be left on the stack.   The
        symbols used are:

                  n,n1,n2 ...         16-bit integer values
                  u,u1,u2 ...         16-bit unsigned integer values
                  d,d1,d2 ...         32-bit integer values
                  ud,ud1,ud2 ...      32-bit unsigned integer values
                  x,x1,x2 ...         32-bit floating point values
                  b,c                 8-bit values
                  cccc,ssss           character strings

        The interpreter characteristics are given below.

             C  The word may be used only within a colon definition.

             E  The  word  should  be executed;  it may not  normally  be
                compiled within a colon-definition.

             I  The word has immediate action,  even when a colon word is
                being defined.

             Words defined by the FORTH-83 Standards Team or by FIG-FORTH
        essentially  follow  their  descriptions.    The  standardization
        levels are given below.

             F  The word is part of the FORTH-83 Standard.

             G  The word is part of FIG-FORTH.

             U  The word is unique to UNIFORTH.














        UNIFORTH VOCABULARY LIST                                Page A-2




        !     n addr ---     F                            "store"
             Store n at address.

        !CSP
             Save the stack position in CSP.   Used as part of the compi-
             ler security.

        !DATE     ---       U
             Store the date into time-keeping buffer CLKADR.   The system
             will prompt you for input.

        !TIME     ---       U
             Store the time into time-keeping buffer CLKADR.   The system
             will prompt you for input.

        #      ud1 --- ud2     F                "sharp"
             The  remainder  of  ud1 divided by BASE is converted  to  an
             ASCII  character and appended to the output  string  towards
             lower  memory addresses.   Result ud2 is the quotient  after
             division  by BASE and is maintained for further  processing.
             Used between <# and #>.

        #>     d --- addr n     F               "sharp-greater"
             End pictured numeric output conversion.  Drop d, leaving the
             text address and character count (as suitable for TYPE).

        #BUFF     --- adr
             A  variable containing the number of disk buffers  allocated
             to the system.

        #S     ud --- 0 0     F                 "sharp-s"
             Convert  all digits of an unsigned 32-bit number ud,  adding
             each  to the pictured numeric output string,  until quotient
             is zero.  A single zero is added to the output string if the
             number  was  initially zero.   Use only between <#  and  #>.

        #TIB      --- adr        F
             A variable containing the number of bytes in the text  input
             buffer.

        $;;                U
             basic case branch terminator word, compiled by ;; .

        $<:                 U
             Basic case branch entry word, compiled by <:.

        $=:                U
             Basic case branch entry word, compiled by =: .

        $>:                 U
             Basic case branch entry word, compiled by >:.










        UNIFORTH VOCABULARY LIST                                Page A-3


        $CASE              U
             Basic case beginning word, compiled by CASE.

        '     --- addr     F,I             "tick"
             Used in the form:
                      ' <name>
             Leave  the code field address of the next word accepted from
             the  input stream.   An error condition exists if not  found
             after  a search of the FORTH vocabulary.   Within  a  colon-
             definition  '  <name> is identical to [ ' <name> ]  LITERAL.


        (                   F,I            "paren"
             Used in the form:
                     ( ccc)
             Accept  and ignore comment characters from the input stream,
             until  the  next right parenthesis.   As a  word,  the  left
             parenthesis must be followed by one blank.  It may be freely
             used  while  executing or  compiling.   An  error  condition
             exists  if  the input stream is exhausted before  the  right
             parenthesis.   The  right parenthesis is pronounced  "close-
             paren"

        (+LOOP)     n ---     G
             The  run-time procedure compiled by +LOOP,  which increments
             the  loop  index by n and tests for  loop  completion.   See
             +LOOP.

        (.")               G
             The run-time procedure,  compiled by ." which transmits  the
             following  in-line text to the selected output device.   See
             ."

        (;CODE)               G
             The run-time procedure, compiled by ;CODE, that rewrites the
             code field of the most recently defined word to point to the
             following machine code sequence.  See ;CODE.

        (DO)               C,G
             The  run-time procedure compiled by DO which moves the  loop
             control parameters to the return stack.  See DO.

        (FIND)     addr1 addr2 --- pfa b tf   (ok)    G
                   addr1 addr2 --- ff        (bad)
             Searches  the dictionary starting at the name field  address
             addr2,  matching  to the text at addr1.   Returns  parameter
             field  address,  length byte of name field and boolean  true
             for  a good match.   If no match is found,  only  a  boolean
             false is left.

        (LATEST)   adr1 --- adr2 adr3     U
             Searching  at  vocabulary  line  adr1,  return  latest  word
             address  in vocabulary (adr2) and a pointer to  the  correct
             link thread (adr3).









        UNIFORTH VOCABULARY LIST                                Page A-4



        (LINE)     n1 n2 --- addr count     G
             Convert  the  line number n1 and the screen n2 to  the  disk
             buffer address containing the data.  The count  left  on the
             stack always is 64, the full line text length.

        (LOOP)               G
             The  run-time  procedure compiled by LOOP  which  increments
             the loop index and tests for loop completion.  See LOOP.

        (NUMBER)   adr --- d      G
             Part of the numeric conversion process.  Called by NUMBER.

        (VALUE)     addr1 --- n     U
             Convert  the ASCII text beginning at addr1+1 with regard  to
             BASE.  The converted 16-bit value n is left on the stack.

        *     n1 n2 --- n3     F           "times"
             Leave the arithmetic product of n1 times n2.

        */     n1 n2 n3 --- n4     F       "times-divide"
             Multiply  n1 by n2,  divide the result by n3 and  leave  the
             quotient  n4.   n4 is rounded toward zero.   The product  of
             n1  times  n2 is maintained as an intermediate 32-bit  value
             for   greater  precision  than  the   otherwise   equivalent
             sequence:  n1 n2 * n3 /

        */MOD     n1 n2 n3 --- n4 n5     F      "times-divide-mod"
             Multiply  n1  by n2,  divide the result by n3 and leave  the
             remainder n4 and quotient n5.   A 32-bit intermediate result
             is used as for */,  and the quotient is rounded toward zero.
             The remainder has the same sign as the divisor, n1.

        +     n1 n2 --- n3     F           "plus"
             Leave the arithmetic sum of n1 plus n2.

        +!     n addr ---     F            "plus-store"
             Add n to the 16-bit value at the address,  by the convention
             given for +.

        +@     n1 n2 --- n3     SYSTEM block 35     U
             Add  n1 to n2 to create an address.   Fetch the contents  of
             that address.

        +DISK                    U
             Turn on text file echo.  Uses channel B.

        +LOOP     n ---     F,I            "plus-loop"
             Add the signed increment n to the loop index.  Return execu-
             tion  to  the  corresponding  DO  until  the  new  index  is
             incremented across the boundary of limit-1 and limit.   Upon
             exit from the loop, discard the loop control parameters.











        UNIFORTH VOCABULARY LIST                                Page A-5


        +ORIGIN    n --- addr     G
             Leave  the  memory  address  relative by  n  to  the  origin
             parameter area.   n is the minimum address unit, either byte
             or  word.  This definition is used to access or  modify  the
             boot-up parameters at the origin area.

        +PRINTER                 U
             Enable  echo  to the printer as well as any  current  output
             device.

        ,     n ---     F                       "comma"
             Allot two bytes in the dictionary, storing n there.

        -     n1 n2 --- n3     F           "minus"
             Subtract n2 from n1 and leave the difference n3.

        -->                G,I             "arrow"
             Continue interpretation with the next sequential block.  May
             be used within a definition.

        -ES       --- n          U
             Leave  the  negative of the system element size on the  data
             stack.  For 16-bit systems, leaves -2.

        -FIND     --- pfa b tf   (found)     G
                  --- ff         (not found)
             Accepts  the  next  text word (delimited by blanks)  in  the
             input  stream  to HERE,  and searches the CONTEXT  and  then
             CURRENT vocabularies for a matching entry.   If  found,  the
             dictionary entry's parameter field address, its length byte,
             and a boolean true is left.  Otherwise, only a boolean false
             is left.

        -ROT     n1 n2 n3 --- n3 n1 n2     U
             Rotate  the  top  stack value to the third  stack  position.
             Inverse operation to ROT.

        -TRAILING     addr n1 --- addr n2     F     "dash-trailing"
             The character count n1 of a text string beginning at addr is
             adjusted  to  exclude trailing blanks.  An  error  condition
             exists if n1 is negative.

        .     n ---     F                  "dot"
             Display n converted according to BASE in a free-field format
             with  one  trailing blank.   Display only a  negative  sign.


















        UNIFORTH VOCABULARY LIST                                Page A-6


        ."              F,I                "dot-quote"
             Interpreted  or  used  in a colon-definition  in  the  form:
                       ." cccc"
             Accept the following text from the input stream,  terminated
             by  " (double-quote).   If executing,  transmit this text to
             the selected output device.   If compiling,  compile so that
             later  execution  will  transmit the text  to  the  selected
             output device.   At least 127 characters are allowed in  the
             text.   If   the  input  stream  is  exhausted  before   the
             terminating double-quote,  an error condition exists.

        .(                       F
             Analogous to dot-quote, except the string is terminated with
             a right-paren.  Execute mode only.

        .DATE          ---     U
             Print  the  date on the current output devices in  the  form
             dd-mmm-yy.

        .FSIZE    ---              U
             Display the current file's size in bytes

        .LINE     line scr ---     G
             Print  on the terminal device,  a line of text from the disk
             by  its  line  and  screen  number.    Trailing  blanks  are
             suppressed.

        .R     n1 n2 ---     G
             Print  the number n1 right aligned in a field whose width is
             n2.  No following blank is printed.

        .S           ---     U
             Non-destructive print of the data stack contents.

        .TIME        ---     U
             Print  the  time on the current output devices in  the  form
             HH:MM:SS.

        /     n1 n2 --- n3     F                     "divide"
             Divide  n1 by n2 and leave the quotient n3.   n3 is  rounded
             toward zero.

        /MOD     n1 n2 --- n3 n4     F               "divide-mod"
             Divide n1 by n2 and leave the remainder n3 and quotient  n4.
             n3 has the same sign as n1. n4 is rounded towards zero.

        0     --- 0     G
             Leave the constant 0 on the stack.

        0<     n --- flag     F                 "zero-less"
             True if n is less than zero (negative).

        0<=     n --- flag     U
             True if n is less than or equal to zero.









        UNIFORTH VOCABULARY LIST                                Page A-7



        0<>     n --- flag     U
             True if n is not equal to zero.

        0=     n --- flag     F                 "zero-equals"
             True is n is zero.

        0>     n --- flag     F                 "zero-greater"
             True if n is greater than zero.

        0>=     n --- flag     U
             True if n is greater than or equal to zero.

        0BRANCH     f ---     G
             The  run-time  procedure to conditionally branch.   If f  is
             false,  the  following  in-line parameter is  added  to  the
             interpretive  pointer to branch ahead of back.   Compiled by
             IF, UNTIL and WHILE.

        1     --- 1     G
             Leave the constant 1 on the stack.

        1+     n --- n+1     F                  "one-plus"
             Increment n by one,  according to the operation for +.

        1+!     addr ---     U
             Increment the contents of addr by 1.

        1-     n --- n-1     F                       "one-minus"
             Decrement  n by one,  according to the  operation  minus.

        1-!     addr ---     U
             Decrement the contents of addr by 1.

        1.E1     --- n1     U
             The floating point constant 10.0 .

        2     --- 2     G
             Leave the constant 2 on the stack.

        2!     d addr ---     F                      "two-store"
             Store  d in 4 consecutive bytes beginning at addr,  as for a
             double number.

        2*     n1 --- n2     G
             Multiply n1 by 2 (signed).

        2+     n --- n+2     F                       "two-plus"
             Increment n by two,  according to the operation for +.

        2+!     addr ---     U
             Increment the contents of addr by 2.











        UNIFORTH VOCABULARY LIST                                Page A-8


        2-     n --- n-2     F                       "two-minus"
             Decrement n by two,  according to the operation for minus.

        2-!     addr ---     U
             Decrement the contents of addr by 2.

        2/     n1 --- n2     U
             Divide n1 by 2 (signed).

        2@     addr --- d     F                      "two-fetch"
             Leave  on  the stack the contents of  the  four  consecutive
             bytes  beginning  at addr,  as for a double  number.

        2>R     d1 ---     F
             Remove  the  topmost 32-bit value from the  data  stack  and
             place it on the return stack.

        2CONSTANT     d ---     F                    "two-constant"
             A defining word used in the form:
                     d 2CONSTANT <name>
             to  create a dictionary entry for <name>,  leaving d in  its
             parameter field.   When <name> is later executed,  d will be
             left on the stack.

        2DROP     d ---     F                   "two-drop"
             Drop the top double number on the stack.

        2DUP     d --- d d     F                "two-dup"
             Duplicate the top double number on the stack.

        2OVER     d1 d2 --- d1 d2 d1     F      "two-over"
             Leave a copy of the second double number on the stack.

        2R>     --- d1     F
             Remove  the  topmost 32-bit value from the return stack  and
             place it on the data stack.

        2ROT     d1 d2 d3 --- d2 d3 d1     F     "two-rote"
             Rotate  the  third double number to the top  of  the  stack.

        2SWAP     d1 d2 --- d2 d1     F         "two-swap"
             Exchange  the  top two double numbers on the  stack.

        2VARIABLE               F               "two-variable"
             Used in the form:
                       2VARIABLE <name>
             Create  a  dictionary entry for <name> and allocate 4  bytes
             for  storage in the parameter field.   When <name> is  later
             executed, it will leave the address of the first byte of its
             parameter field on the stack.

        3     --- n     G
             Leave the constant 3 on the stack.










        UNIFORTH VOCABULARY LIST                                Page A-9


        4+    n1 --- n2     U
             Add 4 to the top stack value.

        4-    n1 --- n2     U
             Subtract 4 from the top stack value.

        8*     n1 --- n2     U
             Multiply n1 by 8 (3-bit left shift).

        :                    F                       "colon"
             A defining word used in the form:
                     : <name> . . . ;
             Create a dictionary entry for <name>,  and set compile mode.
             Words  thus  defined are  called  'colon-definitions'.   The
             compilation  addresses  of subsequent words from  the  input
             stream  which  are not immediate words are stored  into  the
             dictionary  to  be executed when <name> is  later  executed.
             IMMEDIATE  words are executed as encountered.   If a word is
             not found after a search of the vocabulary,  conversion  and
             compilation of a literal number is attempted, with regard to
             the current BASE;  that failing,  an error condition exists.

        ;                 F,I,C                 "semi-colon"
             Terminate  a  colon  definition and  stop  compilation.   If
             compiling  from  mass  storage  and  the  input  stream   is
             exhausted before encountering ';' an error condition exists.

        ;;          U,I
             Terminating  word of a satisfied CASE branch.   Branches  to
             just after CASEND.

        ;CODE             U,I
             Used in the form:
                  : cccc . . . ;CODE . . . END-CODE
             Stop  compilation and terminate a new defining word cccc  by
             compiling  (;CODE).   Assemble the remaining mnemonics until
             reaching END-CODE.  When cccc is later executed in the form:
                        cccc <name>
             the word <name> will be created with its execution procedure
             given by the machine instructions following ;CODE.  That is,
             when <name> is executed,  it does so by jumping to the  code
             after  ;CODE  of cccc.   An existing defining word (such  as
             CREATE) must exist in cccc prior to ;CODE.

        ;S                    G
             Stop interpretation of a screen.

        <      n1 n2 --- flag     F                  "less-than"
             True  if  n1 is less than n2.   Two special  cases  must  be
             considered.  ' -32768 32767 <' must return true, and '-32768
             0' must be distinguished.












        UNIFORTH VOCABULARY LIST                                Page A-10


        <#                     F                "less-sharp"
             Initialize pictured numeric output.  The words:
               <# ## #S HOLD SIGN #>
             can be used to specify the conversion of a double- precision
             number  into an ASCII character string stored  in  right-to-
             left order.

        <:                  U
             Start a less-than conditional in the case statement.

        <<               U
             Mark the current stack position.   Used in conjunction  with
             >> to fill an array.

        <=     n1 n2 --- flag     U
             True if n1 is less than or equal to n2.

        <>     n1 n2 --- flag     U
             Compare  n1  to n2.   If they are not equal,  leave  a  true
             flag; otherwise, leave zero.

        =     n1 n2 --- flag     F                   "equals"
             True if n1 is equal to n2.

        =:     n1 ---          U,I
             Begin  a case comparison.   If satisfied,  execute the words
             following  =:.   Otherwise,  jump to the word following  the
             next ;; .

        =CELLS    n1 --- n1      U
             Add 1 if necessary to make n1 an even number.

        >     n1 n2 --- flag     F                   "greater-than"
             True if n1 is greater than n2.

        >=     n1 n2 --- flag     U
             True if n1 is greater than or equal to n2.

        >>                  U
             Used in the form:
                 << n1 n2 ... nn addr >>
             this word stores all parameters n1, n2, ...nn into the array
             starting at addr with n1 as the first element.

        >BODY       adr1 --- adr2             F
             Move  from the code field address of a word to the parameter
             field address (body).

        >IN     --- addr     F                       "to-in"
             Leave  the address of a variable which contains the  present
             character  offset within the input stream {0...1023}   Note:
             see WORD  (  ."  FIND











        UNIFORTH VOCABULARY LIST                                Page A-11


        >LINK     adr1 --- adr2       F
             Move from the code field address of a word to its link field
             address.

        >NAME     adr1 --- adr2       F
             Move from the code field address of a word to its name field
             address.

        >R     n ---     F,C                    "to-r"
             Transfer n to the return stack.   Every >R must be  balanced
             by  a  R> in the same control structure nesting level  of  a
             colon-definition.

        ?     addr ---     F                    "question-mark"
             Display  the number at address,  using the format of  'dot'.

        ?ALIGN    ---       U
             Force the dictionary pointer to an even address.

        ?BASE                U
             Print the current base in decimal.

        ?BLK     ---     U
             Print the last accessed block in base 10.

        ?COMP          G
             Issue error message if not compiling.

        ?CSP          G
             Issue error message if stack position differs from the value
             saved in CSP.

        ?DUP     n --- n  (n)     F             "query-dup"
             Duplicate n if it is non-zero.

        ?ERROR     f n ---     G
             Issue  an  error message number n,  if the boolean  flag  is
             true.

        ?EXEC          G
             Issue an error message if not executing.

        ?KEY     --- n     U
             Check  to see if a key has been struck on the  keyboard.  If
             so, leave the ASCII value; otherwise, leave a zero.

        ?LOADING          G
             Issue an error message if not loading.

        ?PAIRS     n1 n2 ---     G
             Issue an error message if n1 does not equal n2.  The message
             indicates that compiled conditionals do not match.











        UNIFORTH VOCABULARY LIST                                Page A-12


        ?SAVE     adr --- adr     U
             Flush buffer to disk if it has been updated.   Used by SAVE-
             BUFFERS.

        ?STACK          G
             Issue an error message if the stack is out of bounds.

        ?TERMINAL     --- f     G
             Perform a test of the terminal keyboard for actuation of any
             key.  A true flag indicates actuation.

        @     addr --- n     F                  "fetch"
             Leave on the stack the number contained at addr.

        @!     n addr ---     U
             Fetch  the  contents of addr and use those contents  as  the
             address into which to store n.  (indirect addressing)

        @+     n1 addr --- n2     U
             Fetch the contents of addr and add to n1.

        A'        ---            U
             Used in the form:
                       A' c
             Leave  the  ASCII  code for character c  on  the  stack,  or
             compile into the dictionary if in compile mode.

        ABORT          F
             Clear  the  data and return stack,  setting execution  mode.
             Return control to the terminal.

        ABORT"    flag ---        F             "abort-quote"
             Used in the form:
                  flag ABORT" cccc"
             When  later executed,  if flag is true the characters  cccc,
             delimited  by  the  close-quote,  are displayed and  then  a
             abort sequence that includes ABORT is performed.  If flag is
             false,  the  flag is dropped and execution  continues.   The
             blank following ABORT" is not part of cccc.

        ABS     n1 --- n2     F                 "absolute"
             Leave the absolute value of a number.

        AGAIN     addr n ---     G
             Used in a colon-definition in the form:
                    BEGIN . . . AGAIN
             At   run-time,   AGAIN   forces  execution  to   return   to
             corresponding  BEGIN.   There  is no effect  on  the  stack.
             Execution cannot leave this loop (unless R> DROP is executed
             one level below).













        UNIFORTH VOCABULARY LIST                                Page A-13


        ALLOT     n ---     F                   "allot"
             Allocate n bytes in the dictionary.  The address of the next
             available dictionary location is updated accordingly.

        AND     n1 n2 --- n3     F
             Leave the bitwise logical 'and' of n1 and n2.

        ARRAY               U
             A defining word used in the form:
                  n ARRAY <name>
             create a buffer n cells long (but not preset to zero).  When
             <name>  is subsequently executed,  it leaves the address  of
             the first element.

        ASSEMBLER          F,I
             The  name  of the  assembler  vocabulary.   Execution  makes
             ASSEMBLER  the CONTEXT vocabulary.   ASSEMBLER is immediate,
             so  it  will  execute  during  the  creation  of  a   colon-
             definition, to select this vocabulary at compile time.

        AUTOLOAD  --- adr        U
             A  variable  containing  the block number  you  wish  to  be
             automatically loaded when invoking UNIFORTH.

        B'     --- n     U
             Interpret the next number in base 2 (binary),  regardless of
             the current base.

        B.     n ---     U
             Display  the  number in base 2 (binary),  regardless of  the
             current base.

        B/BUF     --- n     G
             Leave the number of bytes per buffer on the stack (1024).

        BACK     addr ---          G
             Calculate  the backward branch offset from HERE to addr  and
             compile into the next available dictionary memory address.

        BASE     --- addr     F
             Leave  the  address  of a variable  containing  the  current
             input-output numeric conversion base.  {2..70}

        BASE'     ---     U
             A  defining  word used to create temporary  base  conversion
             words.

        BASE.     ---     U
             A  defining  word  used to create  temporary  base  printing
             words.













        UNIFORTH VOCABULARY LIST                                Page A-14


        BEGIN              F,I
             Used in a colon-definition in the forms:
                     BEGIN . . . flag UNTIL
             or
                     BEGIN . . . flag WHILE . . . REPEAT
             BEGIN  marks  the  start of a word sequence  for  repetitive
             execution.   A BEGIN-UNTIL loop will be repeated until  flag
             is  true.   A BEGIN-WHILE-REPEAT loop will be repeated until
             flag  is  false.   The words after UNTIL or REPEAT  will  be
             executed  when  either loop is  finished.   Flag  is  always
             dropped after being tested.

        BELL                  U
             Send an ASCII 07 (bell) to the current output device.

        BINARY                U
             Change the current base to binary (base 2).

        BL     --- c     G
             A constant that leaves the ASCII value for a blank (32).

        BLANKS     addr count ---     G
             Fill an area of memory beginning at addr with count blanks.

        BLK     --- addr     F                  "b-l-k"
             Leave the address of a variable containing the number of the
             mass storage block being interpreted as the input stream. If
             the  content  is zero,  the input stream is taken  from  the
             text input buffer.

        BLOCK     n --- addr     F
             Leave  the  address of the first byte in block  n.   If  the
             block is not already in memory,  it is transferred from mass
             storage into whichever memory buffer has been least recently
             accessed.  If  the  block  occupying that  buffer  has  been
             UPDATEd (i.e.  modified),  it is rewritten onto mass storage
             before  block n is read into the buffer.   n is an  unsigned
             number.   If   correct  mass  storage read or write  is  not
             possible,  an error condition exists.

        BMOVE     blk1 blk2 n ---     U
             Move  n  blocks starting at blk1 to the region  starting  at
             blk2.  The  lowest  numbered block of region blk1  is  moved
             first.

        BMOVE>     blk1 blk2 n ---     U
             Move  n  blocks starting at blk1 to the region  starting  at
             blk2.   The  highest numbered block of region blk1 is  moved
             first.














        UNIFORTH VOCABULARY LIST                                Page A-15


        BRANCH          G
             The  run-time procedure to unconditionally branch.   An  in-
             line  offset  is  added to the interpretive  pointer  IP  to
             branch  ahead or back.   BRANCH is compiled by ELSE,  AGAIN,
             REPEAT.

        BS                  U
             Send an ASCII 08 (backspace) to the current output device.

        BSWAP     n1 --- n2     U
             Swap the bytes of the 16-bit value n1.

        BUFFER     n --- addr     F
             Obtain the next block buffer,  assigning it to block n.  The
             block  is  not  read from mass  storage.   If  the  previous
             contents  of the buffer has been marked as  UPDATEd,  it  is
             written to mass storage.  If correct writing to mass storage
             is  not possible,  an error condition exists.   The  address
             left  is the first byte within the buffer for data  storage.
             n is an unsigned number.

        BYE       ---       U
             Exit  UNIFORTH and return to your operating system,  closing
             the current file in the process.

        C!      n addr ---       F              "c-store"
             Store the least significant 8-bits of n at addr.

        C,     n ---          G
             Store  8 bits of n into the next available dictionary  byte,
             advancing the dictionary pointer by one.

        C/L     --- n     G
             Leave the number of characters per line (64).

        C@     addr --- byte     F                   "c-fetch"
             Leave  on  the stack the contents of the byte at addr  (with
             the higher bits zero, in a 16-bit field).

        CARRAY     n ---     U
             A defining word used in the form:
                  n CARRAY <name>
             create a buffer n bytes long (but not preset to zero).  When
             <name>  is subsequently executed,  it leaves the address  of
             the first element.


















        UNIFORTH VOCABULARY LIST                                Page A-16


        CASE                U,I
             A multiple-IF statement used in the form:
                  CASE
                      n1 =: . . . ;;
                      n2 >: . . . ;;
                      n3 <: . . . ;;
                      NOCASE =: . . . ;;
                 CASEND
             It requires a testing value on the stack (it will be removed
             by CASE).  n1, n2, ... are comparison value.  If the testing
             value is equal to,  less than or greater than any of the set
             (n1,n2,...),  then the words following the corresponding =:,
             <:  or  >:  are executed,  followed by a branch  to  CASEND.
             NOCASE is an optional test to satisfy all non-tested values.

        CASEND          U,I
             The terminating statement for CASE.   Drops the tested value
             from the stack.  See CASE.

        CBLIST     n1 n2 ---     U
             List all blocks between n1 and n2 inclusive,  one at a time.
             To  list  the next block,  hit any key.   To  terminate  the
             listing abnormally, enter the escape key.

        CDUMP     addr n ---     U
             Dump n bytes starting at addr in hex format.   Sixteen bytes
             are listed per line,  followed by their ASCII  equivalences.
             Non-printing ASCII characters are indicated by periods.  You
             can terminate abnormally by striking any key.

        CHANA     ---       U
             Make channel A the current default file channel.

        CHANB     ---       U
             Make channel B the current default file channel.

        CLKADR     --- adr     U
             The starting address of the 6-byte date and time buffer.

        CLOSE        ---       U
             Close the current file.

        CLR-BLK     n ---     U
             Fill block n with blanks, and put a ;S at its beginning.

        CMOVE     addr1 addr2 n ---     F       "c-move"
             Move  n  bytes  beginning at address addr1  to  addr2.   The
             contents  of  addr1 are moved first proceeding  toward  high
             memory.   If n is zero or negative nothing is moved.

        CMOVE>     adr1 adr2 n ---     F
             Move  n  bytes  beginning  at address  adr1  to  adr2.   The
             contents of adr1 are moved first preceeding from the end  of
             the buffer toward low memory.









        UNIFORTH VOCABULARY LIST                                Page A-17



        CMPS     adr1 adr2 cnt --- f     U
             Compare  the string starting at adr1 to the string at  adr2,
             each  with  length cnt bytes.   If str1 is less  than  str2,
             leave -1 ; if str1 is equal to str2, leave zero ; if str1 is
             greater than str2, leave one.

        CODE               F,I
             A defining word used in the form:
                       CODE <name> . . . END-CODE
             Create  a  dictionary entry for <name>,  and  set  execution
             mode.   Words  thus compiled are called  'code-definitions'.
             Used in creating assembly language routines.

        COLD          G
             The cold start procedure to adjust the dictionary pointer to
             the initial settings and restart via ABORT.

        COMPILE               F,C
             When  a word containing COMPILE executes,  the 16-bit  value
             following  the  compilation  address of  COMPILE  is  copied
             (compiled) into the dictionary.   That is,  COMPILE DUP will
             copy the compilation address of DUP.

        CONSTANT     n ---     F
             A defining word used in the form:
                        n CONSTANT <name>
             to  create a dictionary entry for <name>,  leaving n in  its
             parameter field.   When <name> is later executed,  n will be
             left on the stack.

        CONTEXT     --- addr     F
             A  user  variable  containing a pointer  to  the  vocabulary
             within which dictionary searches will first begin.

        CONTROLS?     adr cnt --- f     U
             Check the buffer starting at adr with length cnt bytes.   If
             there  are any control characters (ASCII 31 or less) in  the
             buffer, leave a 1 on the stack; otherwise, leave a 0.

        CONVERT     d1 addr1 --- d2 addr2     F
             Convert  the ASCII text beginning at addr1+1 with regard  to
             BASE.   The new value is accumulated into double number  d1,
             being  left  as  d2.   Addr2  is the address  of  the  first
             unconvertable digit.  Used by NUMBER.

        COPY     n1 n2 ---     U
             Copy block n1 into block n2.

        COPYATOB       n1 n2 ---      U
             Copy block n1 from channel A to block n2 in channel B.












        UNIFORTH VOCABULARY LIST                                Page A-18


        COUNT     addr --- addr+1 n     F
             Leave  the  address addr+1 and the character count  of  text
             beginning at addr.   The first byte at addr must contain the
             character count n.  Range of n is {0..255}.

        CR                     F                          "c-r"
             Cause  a  carriage-return  and line-feed  to  occur  at  the
             current output device.

        CREATE                F
             A defining word used in the form:
                      CREATE <name>
             to create a dictionary entry for <name>,  without allocating
             any  parameter  field memory.   When <name> is  subsequently
             executed,   the  address  of  the  first  byte  of  <name>'s
             parameter field is left on the stack.

        CSP     --- addr     G
             A  user  variable  temporarily  storing  the  stack  pointer
             position,     for compilation error checking.

        CURRENT     --- addr     F
             A variable containing the current vocabulary pointer.

        D+     d1 d2 --- d3     F               "d-plus"
             Leave the arithmetic sum of d1 and d2.

        D-     d1 d2 --- d3     F                    "d-minus"
             Subtract d2 from d1 and leave the difference d3.

        D>S      d --- n     G
             Truncate  the double precision value to its single precision
             equivalent.  Same as DROP.

        D.     d ---     F                      "d-dot"
             Display  d  converted  according to  BASE  in  a  free-field
             format,  with one trailing blank.   Display the sign only if
             negative.

        D.R     d n ---     F                   "d-dot-r"
             Display d converted according to BASE, right aligned in an n
             character field.  Display the sign only if negative.

        D0<     d --- flag     U
             Leave true if d is less than zero.

        D0=     d --- flag     F                "d-zero-equals"
             Leave true if d is zero.

        D<     d1 d2 --- flag     F             "d-less"
             True if d1 is less than d2.  "d-less"

        D=     d1 d2 --- flag     F             "d-equal"
             True is d1 equals d2.









        UNIFORTH VOCABULARY LIST                                Page A-19



        DABS     d1 --- d2     F           "d-abs"
             Leave as a positive double number d2,  the absolute value of
             a double number, d1.  {0..2,147,483,647}

        DECIMAL             F

             Set the input-output numeric conversion base to ten.

        DEFINITIONS               F
             Used in the form:
                   cccc DEFINITIONS
             Set  the CURRENT vocabulary to the CONTEXT  vocabulary.   In
             the  example,  executing  vocabulary  name ccc made  it  the
             CONTEXT  vocabulary  and  executing  DEFINITIONS  made  both
             specify vocabulary cccc.

        DELETE     ---     U
             When used in the form:
                       DELETE <fname>
             removes the file from the current directory.

        DEPTH     --- n     F
             Leave  the number of the quantity of 16-bit values contained
             in the data stack, before n was added.

        DIGIT     c n1 --- n2 tf  (ok)        G
                  c n1 --- ff     (bad)
             Converts the ASCII character c (using base n1) to its binary
             equivalent  n2,   accompanied  by  a  true  flag.    If  the
             conversion is invalid, leaves only a false flag.

        DLITERAL     d --- d  (executing)     G
                     d ---    (compiling)
             If compiling,  compile a stack double number into a literal.
             Later  execution  of the definition containing  the  literal
             will push it to the stack.   If executing,  the number  will
             remain on the stack.

        DMATRIX               U
             A defining word used in the form:
                    n1 n2 DMATRIX <name>
             to  create a dictionary entry for <name>,  making  a  double
             precision  matrix  n1*n2*2 cells in length,  presetting  all
             elements to zero.   When <name> is later executed,  it  uses
             the  top stack parameter as the column number {0..n2-1}  and
             the second stack parameter as the row number {0..n1-1},  and
             returns the address of that element.

        DMAX     d1 d2 --- d3     F             "d-max"
             Leave the larger of two double numbers.

        DMIN     d1 d2 --- d3     F             "d-min"
             Leave the smaller of two double numbers.









        UNIFORTH VOCABULARY LIST                                Page A-20



        DNEGATE     d --- -d     F                   "d-negate"
             Leave the double number two's complement of a double number,
             i.e., the difference 0 less d.

        DO     n1 n2 ---     F,I
             Use in a colon-definition:
                       DO . . . LOOP
               or
                       DO . . . +LOOP
             Begin   a  loop  which  will  terminate  based  on   control
             parameters.  The  loop  index begins at n2,  and  terminates
             based  on  the limit n1.   At LOOP or +LOOP,  the  index  is
             modified  by a positive or negative value.   The range of  a
             DO-LOOP is determined by the terminating word.   DO-LOOP may
             be nested.

        DOES>                 F,I,C                  "does"
             Define the run-time action of a word created by a high-level
             defining word.  Used in the form:
                  : <name> . . . CREATE . . . DOES> . . . ;
                  and then  <name> <namex>
             Marks  the termination of the defining part of the  defining
             word <name> and begins the definition of the run time action
             for  words  that  will  later  be  defined  by  <name>.   On
             execution of <namex> the sequence of words between DOES> and
             ;  will be executed, with the address of <namex>'s parameter
             field on the stack.

        DP     --- addr     G
             A user variable,  the dictionary pointer, which contains the
             address   of  the  next  free  memory  location  above   the
             dictionary.  The  value may be read by HERE and  altered  by
             ALLOT.

        DPL     --- addr     G
             A user variable containing the number of digits to the right
             of the decimal on floating point input.

        DROP      n ---          F
             Drop the top number from the stack.

        DTOR      --- x1          U
             A constant containing the conversion factor from degrees  to
             radians.

        DU<     ud1 ud2 --- flag     F               "d-u-less"
             True  if ud1 is less than ud2.   Both numbers are  unsigned.

        DUMP     addr n ---     G
             Dump  n cells starting at addr.   Eight cells are listed per
             output line in the current base.  The dump can be terminated
             abnormally by striking any key.










        UNIFORTH VOCABULARY LIST                                Page A-21


        DUP     n --- n n     F
             Leave a copy of the top stack number.

        DVECTOR                U
             A defining word used in the form:
                   n DVECTOR <name>
             to  create  a dictionary entry for <name> and make a  double
             precision  vector,  preset to zero.   When <name>  is  later
             executed,  it  uses  the  top stack value as  an  index  and
             returns the corresponding element address <stgadr+2*value>.

        E.        x ---          U
             Print floating point number in free-format exponent form.

        E-        n1 --- n2      U
             Subtract the current element size from the top stack value.

        E+        n1 --- n2      U
             Add the current element size to the top stack value.

        EDIT     n ---     U
             Start editing block (screen) number n.

        EDITOR          U
             The name of the video editor vocabulary.

        EI+       n1 --- n2      U
             Add the loop index*element size to the top stack value.

        EI+!      n1 adr ---     U
             Add the loopindex*elementsize to the address,  and store  n1
             at the resultant address.

        EI+@      n1 --- n2      U
             Add the loopindex*elementsize to the top stack value.  Using
             the result as an address, fetch the contents.

        EI-       n1 --- n2      U
             Subtract the loopindex*elementsize from the top stack value.

        ELSE          F,I
             Used in a colon-definition in the form:
                   IF . . . ELSE . . . THEN
             ELSE executes after the true part following IF.  ELSE forces
             execution to skip till just after THEN.  It has no effect on
             the stack.  (See IF)

        EMIT     char ---     F
             Transmit character to the current output device.














        UNIFORTH VOCABULARY LIST                                Page A-22


        EMPTY-BUFFERS          F
             Mark  all  block  buffers  as  empty,   without  necessarily
             affecting  their actual contents.   UPDATEd blocks  are  not
             written to mass storage.

        ENCLOSE     adr1 c --- adr1 n1 n2 n3     KERNEL     G
             The  text  scanning primitive used by WORD.   From the  text
             address  adr1 and an ASCII delimiting character  c,  ENCLOSE
             determinines  the  byte offset to  the  first  non-delimiter
             character  n1,  the offset to the first delimiter after  the
             text n2, and the offset to the first character not included.
             This  procedure  will  not  process past  an  ASCII  'null',
             treating it as an unconditional delimiter.

        END-CODE    ---     F
             Terminate a machine-code definition.

        ER1     ---     U
             An error handling word.

        ER2     ---     U
             An error handling word.

        ER3     ---         U
             An error handling word.

        ERASE     addr nbytes ---     G
             Clear a region of memory to zero starting at addr.

        ERCODE         --- n          U
             Return the last disk error code.

        ERROR     line ---     G
             Execute error notification and possible restart of system.

        ES        --- n          U
             Leave the element size of the current system (16-bit = 2).

        EXCHANGE     n1 n2 ---     U
             Exchange the contents of disk blocks n1 and n2.

        EXECUTE     addr ---     F
             Execute the dictionary entry whose code field address is  on
             the stack.

        EXIT          F,C
             When compiled within a colon-defintion,  terminate execution
             of that definition, at that point.  May not be used within a
             DO-LOOP.














        UNIFORTH VOCABULARY LIST                                Page A-23


        EXPECT     addr n ---     F
             Transfer  characters  from the terminal beginning  at  addr,
             upward,  until  a  "return"  or  the count  of  n  has  been
             received.  Take  no action for n less than or equal to zero.
             The  number  of  characters received is stored  in  variable
             SPAN.

        EXPECTBL  addr n ---          U
             Same  as EXPECT except leaves a blank (ASCII 32)  after  the
             entered string.

        EXTEND     n ---       U
             Extend the current file by n blocks,  setting  each to blank
             except for a ";S" in the first bytes.

        F*     x1 x2 --- x3     U
             Multiply x1 by x2, leaving the floating point result x3.

        F/     x1 x2 --- x3     U
             Divide x1 by x2, leaving the floating point result x3.

        F+     x1 x2 --- x3     U
             Add x1 to x3, leaving the floating point result x3.

        F-     x1 x2 --- x3     U
             Subtract x2 from x1, leaving the floating point result x3.

        F.        x1 ---         U
             Print floating point number in free format.  #digits printed
             is limited by constant FPSIG.

        FACOS          x1 --- x2   U
             Take the arc-cosine of an angle (x2 in radians).

        FALSE          --- n          U
             Return the value of a false flag (0).

        FASIN          x1 --- x2      U
             Take the arc-sine of an angle (x2 in radians).

        FATAN          x1 --- x2      U
             Take the arc-tangent of an angle (x2 in radians).

        FCB       --- n1         U
             Leave the address of the current File Control Block.

        FCONSTANT      x ---     U
             A defining word used in the form:
                  n FCONSTANT <name>
             To  create  a  dictionary  entry  for  <name>,  leaving  the
             floating  point  constant x in its  parameter  field.   When
             <name> is later executed, n will be left on the stack.











        UNIFORTH VOCABULARY LIST                                Page A-24


        FCOS      x1 --- x2      U
             Take the cosine of an angle (radians).

        FENCE     --- G
             A user variable containing an address below which FORGETting
             is trapped.  To forget below this point, the user must alter
             the contents of FENCE.

        FEXP      x1 --- x2      U
             Raise x1 to the e power.

        FILESTATUS     ---       U
             List on the console information about the current file.

        FILL     addr n byte ---     F
             Fill memory beginning at address with a sequence of n copies
             of byte.   If the quantity n is less than or equal to  zero,
             take no action.

        FIND     --- addr     U
             Leave  the compilation address of the next word name,  which
             is accepted from then input stream.   If that word cannot be
             found in the dictionary after a search, leave zero.

        FIRST     --- n     G
             A  variable that leaves the address of the  first  (lowest)
             block buffer.

        FIX     x1 --- d1     U
             Convert floating point x1 to a double precision integer d1.

        FLD     --- addr     G
             A user variable for control of number output field width.

        FLN       x1 --- x2      U
             Take the natural (base e) logarithm of x1.

        FLOAT     d1 --- x1     U
             Convert  double  precision  integer  d1  to  the  equivalent
             floating point value x1.

        FLOG2     x1 --- x2      U
             Take the log base 2 of x1.

        FLOG10    x1   --- x2         U
             Take the common logarithm (base 10) of x1.

        FLUSH     ---     U,G
             A synonym for SAVE-BUFFERS.














        UNIFORTH VOCABULARY LIST                                Page A-25


        FMATRIX        n1 n2 ---      U
             A defining word used in the form:
                       n1 n2 FMATRIX <name>
             to  create  a  dictionary  entry for  <name>,  making  a  2-
             dimensional floating point matrix n1*n2 elements in  length.
             When  <name>  is  later  executed,  it uses  the  top  stack
             parameter  as  the column number {0..n2-1}  and  the  second
             stack parameter as the row number {0..n1-1}, and returns the
             address of that element.

        FNEGATE     x1 ---  -x1      U
             Change the sign of the floating point number x1.

        FORGET                  F
             Execute in the form:
                    FORGET <name>
             Delete from the dictionary <name> and all words added to the
             dictionary after <name>.  Failure to find <name> is an error
             condition.

        FORM               U
             Send an ASCII 12 (formfeed) to the current output devices.

        FORTH               F
             The  name of the primary vocabulary.   Execution makes FORTH
             the CONTEXT vocabulary.   Until additional user vocabularies
             are  defined,  new user definitions become a part of  FORTH.
             FORTH is immediate,  so it will execute during the  creation
             of a colon-definition,  to select this vocabulary at compile
             time.

        FSIN      x1 --- x2      U
             Take the sine of an angle (radians).

        FSQRT     x1 --- x2      U
             Take the square root of x1.

        FTAN      x1 --- x2      U
             Take the tangent of an angle (radians).

        FVARIABLE      ---       U
             A defining word executed in the form:
                       FVARIABLE <name>
             to  create a dictionary entry for <name> and allot space for
             one  floating-point element in its  body.   The  application
             must  initialize  the stored value.   When <name>  is  later
             executed, it will place the storage address on the stack.
















        UNIFORTH VOCABULARY LIST                                Page A-26


        FVECTOR        n ---          U
             A defining word used in the form:
                       n FVECTOR <name>
             to  create a dictionary entry for <name> ana allot space for
             n floating-point elements (a one-dimensional vector).   When
             name  is later executed,  it uses the top stack value as  an
             index  {0..n-1}  into the array and returns the  address  of
             that element.

        GETBUF    blk# --- bufadr flag     U
             Examine the block buffers,  and return the address of one of
             them.  If that buffer has been updated, flag=true.

        GETNUM     --- val     U
             Interactively bring in the next number from the keyboard.

        H'     --- n     U
             Interpret the next number in hex,  regardless of the current
             base.

        H.     n ---     U
             Print the top stack value in hexadecimal,  regardless of the
             current base.

        HASH      stradr vocptr --- stradr vocthd         U
             Used for "hashing" the dictionary into 4 threads.

        HDUMP     addr n ---     U
             Same  as DUMP,  but in hexadecimal regardless of the current
             base.

        HERE     --- addr     F
             Return   the  address  of  the  next  available   dictionary
             location.

        HEX               G
             Change the current numberic input base to hexadecimal  (base
             16).

        HLD     --- addr     G
             A  user  variable  that  holds the  address  of  the  latest
             character of text during numeric output conversion.

        HOLD     char ---     F
             Insert char into a pictured numeric output string.  May only
             be used between <# and #>.

        I     --- n     F,C
             Copy  the loop index onto the data stack.   Can only be used
             in the forms
                   DO . . . I . . . LOOP
             or
                  DO . . . I . . . +LOOP










        UNIFORTH VOCABULARY LIST                                Page A-27


        I+        n1 --- n2      U
             Add index I to the top stack value.

        I-     n1 --- n2     U,C
             Subtract index I from the top stack value.

        ID.     addr ---     G
             Print a definition's name from its name field address.

        IF     flag ---     F,I
             Used in a colon-definition in the forms:
                  flag IF . . . ELSE . . . THEN
              or
                  flag IF . . . THEN
             If flag is true, the words following IF are executed and the
             words  following  ELSE  are  skipped.    The  ELSE  part  is
             optional.  If flag is false,  words between IF and ELSE,  or
             between  IF  and THEN (when no ELSE is used),  are  skipped.
             IF-ELSE-THEN conditionals may be nested.

        IMMEDIATE               F
             Mark the most recently made dictionary entry as a word which
             will be executed when encountered during compilation  rather
             than compiled.

        INCLUDE        n1 ---    U
             Used in the form:
                  INCLUDE <fname>
             Close the current file,  saving any updated blocks.   Switch
             to  file  fname,  load  block 01,  and then  return  to  the
             original file.  Only one level of nesting is allowed.

        INDEX     n1 n2 ---     G
             Print  the first line of each screen over the range n1 to n2
             inclusive.   This  is used to view the comment lines  of  an
             area of text on disk screens.

        INDGEN     addr n ---     U
             Fill  n cells starting at addr with the cell  number.   That
             is, (addr)=0, (addr+2)=1, (addr+4)=2, ...  Used to preset an
             array to its element numbers.

        INTERPRET              G
             The  outer  text interpreter which sequentially executes  or
             compiles  text  from  the input stream  (terminal  or  disk)
             depending on STATE.   If the word name cannot be found after
             a search of CONTEXT and CURRENT,  then it is converted to  a
             number according to the current base.  That also failing, an
             error message echoing the name with a "?" will be given.

        IO!     val port ---     U
             Store the 16-bit value val into port.











        UNIFORTH VOCABULARY LIST                                Page A-28


        IO@     port --- val     U
             Fetch a 16-bit value from a port.

        IOBYTE     --- addr      U
             A variable containing the printer/terminal output flag.

        IOC!    val port ---     U
             Store the 8-bit value val into port.

        IOC@     port --- val     U
             Fetch an 8-bit value from a port.

        J     --- n     F,C
             Return  the index of the next outer loop.   May be used only
             within a nested DO-LOOP in the form:
                  DO . . . DO . . . J . . . LOOP . . . LOOP

        KEY     --- char     F
             Leave  the ASCII value of the next available character  from
             then current input device.

        LATEST     --- addr     G
             Leave  the  name field address of the topmost  word  in  the
             CURRENT vocabulary.

        LEAVE               F
             Force   immediate  termination  of  a  DO-LOOP.    Execution
             continues after the next LOOP or +LOOP.

        LF              U
             Send an ASCII 10 (linefeed) to the current output device.

        LIMIT     --- n     G
             A variable leaving the address just above the highest memory
             available  for a disk buffer.   Usually this is the  highest
             system memory.

        LINE     n1 --- n2     U
             Leave  the buffer address n2 of the n1th line in the current
             screen (pointed to by SCR).

        LIST     n ---     F
             List the ASCII symbolic contents of screen n on the  current
             output device, setting SCR to contain n.  n is unsigned.

        LIT     --- n     G
             Within  a  colon-definition,  LIT is automatically  compiled
             before each 16-bit literal number encountered in input text.
             Later  execution  of  LIT causes the contents  of  the  next
             dictionary address to be pushed to the stack.













        UNIFORTH VOCABULARY LIST                                Page A-29


        LITERAL     n ---     F,I
             If  compiling,  then compile the stack value n as  a  16-bit
             literal,  which  when  later executed,  will leave n on  the
             stack.

        LOAD     n ---     F
             Begin  interpretation  of screen n by making  it  the  input
             stream;  preserve  the locators of the present input  stream
             (from  >IN  and BLK).   If interpretation is not  terminated
             explicitly  it will be terminated when the input  stream  is
             exhausted.    Control  then  returns  to  the  input  stream
             containing LOAD, determined by the input stream locators >IN
             and BLK.

        LOOP            F,I
             Increment  the DO-LOOP index by one,  terminating  the  loop
             when  the new index crosses the boundary between limit-1 and
             limit.

        LOWUP     --- adr        U
             A variable containing the flag that determines if input text
             is  to  be  converted to upper  case  before  searching  the
             dictionary.

        M/MOD     d n1 --- n2 n3     G
             A  mixed  magnitude  math operator which leaves  the  signed
             remainder  n2 and signed quotient n3,  from a double  number
             dividend and divisor n1.   The remainder takes its sign from
             the dividend.

        MAKE      ---       U
             Used in the form:
                  MAKE <fname>
             Create a new file called fname.  After MAKE is executed, you
             are left in the new file.

        MAKE-CHAN      ---       U
             Make a new FCB/channel for file access.

        MATCH    adr1 n1 adr2 n2 --- n3     U
             Find  the  string  starting at adr2 (n2 bytes long)  in  the
             larger string starting at adr1 (n1 bytes long,  n1>n2). If a
             match  occurs,  leave  the address (in buffer adr1)  of  the
             first correct character; otherwise, leave 0.

        MATRIX            U
             A defining word used in the form:
                       n1 n2 MATRIX <name>
             to  create  a  dictionary  entry for  <name>,  making  a  2-
             dimensional array (matrix) n1*n2 cells in length, presetting
             all  elements to zero.   When <name> is later  executed,  it
             uses the top stack parameter as the column number  {0..n2-1}
             and  the second stack parameter as the row number {0..n1-1},
             and returns the address of that element.









        UNIFORTH VOCABULARY LIST                                Page A-30



        MAX     n1 n2 --- n3     F                        "max"
             Leave the greater of two numbers.

        MAXI     --- n1     U,C
             Copy  the maximum iteration counter of the  current  DO-LOOP
             from the return stack to the data stack.

        MCOPY     n1 n2 n3 ---     U
             Copy  n3  blocks  from channel A (starting at block  n1)  to
             channel B (starting at block n2).

        MESSAGE     n ---     G
             Print  on  the  selected output device the text  of  line  n
             relative  to  screen 200 of drive 0.   n may be positive  or
             negative.  MESSAGE may be used to print incidental text such
             as  report headers.   If WARNING is zero,  the message  will
             simply be printed as a number (disk not available).

        MIN         n1 n2 --- n2     F               "min"
             Leave the lesser of two numbers.

        MOD         n1 n2 --- n3     F                    "mod"
             Divide  n1 by n2,  leaving the remainder n3,  with the  same
             sign as n1.

        MOVE     addr1 addr2 n ---     F
             Move  the  specified  quantity  n  of  16-bit  memory  cells
             beginning  at addr1 into memory at addr2.   The contents  of
             addr1 is moved first.   If n is negative or zero, nothing is
             moved.

        MS     n ---     G
             Delay n milliseconds before continuing execution.

        MSGBLK     --- adr     U
             Used  by MESSAGE.   A variable containing the starting block
             number on which messages are stored.

        NAME>     adr1 --- adr2       F
             Convert  the  name  field address adr1 of a  word  into  its
             corresponding code field address adr2.

        NEGATE     n --- -n     F
             Leave the two's complement of a number, i.e., the difference
             of 0 less n.

        NOCASE     n1 --- n1 n1     U
             Same as DUP, used in CASE statement.

        NOOP     ---           G
             Perform no operation whatsoever.











        UNIFORTH VOCABULARY LIST                                Page A-31


        NOT     n1 --- n2     U
             Perform the one's complement of n1.

        NUMBER     addr --- d     G
             Convert  a character string left at addr with  a  preceeding
             count,  to a signed double number, using the current numeric
             base.   If  numeric  conversion is not  possible,  an  error
             message will be given.

        O'     --- n     U
             Interpret  the  next number in base  8,  regardless  of  the
             current base.

        O.     n ---     U
             Print n in octal, regardless of the current base.

        OCTAL          U
             Change  the  current numeric conversion base to octal  (base
             8).

        ODUMP     addr n -----     U
             Same  as  DUMP,  except output is in  octal,  regardless  of
             current base.

        OFFSET     --- addr     U
             A  user variable which contains the sector offset  from  the
             beginning of the current drive.  This offset is added to all
             sector   requests.    Note   the  difference  between   this
             definition and the FIG definition.

        OPEN      ---       U
             Used in the form:
                  OPEN <fname>
             This  word attempts to open file fname for future  I/O.   If
             fname  does  not currently exist,  UNIFORTH will  query  you
             about creating it.

        OR     n1 n2 --- n3     F
             Leave the bitwise inclusive-or of two numbers.

        OUT     --- addr     G
             A  user variable that contains a value incremented by  EMIT.
             The  user  may  alter and examine  OUT  to  control  display
             formatting.

        OVER     n1 n2 --- n1 n2 n1     F
             Leave a copy of the second number on the stack.

        P+     n1 n2 n3 n4 --- n5 n6     U
             Perform addition of an ordered pair.  The results are:
                  n5=n1+n3       n6=n2+n4
             Used in the editor for offsets on x,y cursor positioning.











        UNIFORTH VOCABULARY LIST                                Page A-32


        PAD     --- addr     F
             The address of a scratch area used to hold character strings
             for intermediate processing.  The minimum capacity of PAD is
             64 characters (addr through addr+63).

        PICK     n1 --- n2     SYSTEM block 25     F
             Return  a  copy of the n1th stack  value,  not  counting  n1
             itself.  Aero relative:  1 PICK is equivalent to OVER.

        PLUS?     --- flag     U
             A  flag for Z.R.   If PLUS?  is nonzero,  Z.R will include a
             plus sign preceding all positive numbers.

        PRECIS     --- adr     U
             A USER variable containing the precision flag  (0=16,  1=32,
             integer; 2=32-bit floating) of the last number converted.

        PREMIT     b ---     U
             Send a single ASCII character to the printer.

        PREV     --- addr     G
             A  variable  containing the address of the disk buffer  most
             recently referenced.   The UPDATE commands marks this buffer
             to be later written to disk.

        PRINTER               U
             Select the printer to be the current output device.

        QUERY               F
             Accept  input  of up to 80 characters (or until a  'return')
             from  the  operator's  terminal,  into  the  terminal  input
             buffer.  WORD may be used to accept text from this buffer as
             the input stream, by setting >IN and BLK to zero.

        QUIT                F
             Clear the return stack,  setting execution mode,  and return
             control to the terminal.  No message is given.

        R#     --- addr     G
             A user variable which may contain the location of an editing
             cursor, or ther file related function.

        R/W     addr blk f ---     G
             The primitive block-oriented disk read/write routine.   Addr
             specified the source or destination block buffer, blk is the
             sequential number of the referenced block,  and f is a  flag
             (f=0,  write;  f=1,  read).   R/W determines the location on
             mass   storage,   performs  the  read/write  and  all  error
             checking.

        R>     --- n     F,C
             Transfer  n from the return stack to the  data  stack.   "r-
             from"










        UNIFORTH VOCABULARY LIST                                Page A-33


        R0     --- addr     G
             A  user  variable  containing the initial  location  of  the
             return stack.  "r-zero"  See RP!

        R@     --- n     F,C
             Copy  the number on the top of the return stack to the  data
             stack.  "r-fetch"

        REMSPACE             G
             Print   the   remaining  space  (in  bytes)  available   for
             dictionary entries.

        REPEAT              F,I,C
             Used in a colon-definition in the form:
                  BEGIN . . . WHILE . . . REPEAT
             At run-time,  REPEAT returns to just after the corresponding
             BEGIN.

        ROLL     n ---     F
             Extract  the n-th stack value to the top of the  stack,  not
             counting  n  itself,  moving the remaining values  into  the
             vacated  position.   An error condition results for  n  less
             than  one.   3  ROLL is the same as ROT.   1 ROLL is a  null
             operation.

        ROT     n1 n2 n3 --- n2 n3 n1     F
             Rotate  the top three values,  bringing the deepest  to  the
             top.  "rote"

        RP@     --- n1     G
             Copy  the address that the return stack pointer is  pointing
             to onto the data stack.

        RP!          G
             Initialize the return stack pointer from user variable R0.

        S>D     n --- d     G
             Sign  extend a single 16-bit number to form a double  32-bit
             number.

        S0     --- addr     G
             A  user  variable that contains the initial  value  for  the
             stack pointer.  "s-zero"   See SP!

        SAVE-BUFFERS             F
             Write  all blocks to mass storage that have been flagged  as
             UPDATEd.  An error condition results if mass storage writing
             is not completed.  A synonym is FLUSH.

        SCR     --- addr     F
             Leave the address of a variable containing the number of the
             screen most recently listed.  "s-c-r"











        UNIFORTH VOCABULARY LIST                                Page A-34


        SHIFT     n1 n2 --- n3     U
             Shift n1 by n2 bits right or left.   If n2 is negative,  the
             shift is to the left; if positive, to the right.

        SHOW     n1 n2 ---     G
             List  all blocks at least including n1 through n2  in  TRIAD
             form.

        SHUCK    adr1 adr2 ---     U
             Remove all words following adr1 in the vocabulary pointed to
             by adr2.

        SIGN     n ---     F,C
             Insert  the ASCII "-" (minus sign) into the pictured numeric
             output string, if n is negative.

        SIGNON               U
             A  word that prints the signon message of UNIFORTH and  then
             enters ABORT.

        SMUDGE               G
             Used  during word definition to toggle the "smudge bit" in a
             definition's  name  field.   This  prevents  an  uncompleted
             definition  from  being found  during  dictionary  searches,
             until compiling is completed without error.

        SP!               G
             Initialize the data stack pointer from user variable S0.

        SP@     --- addr     G
             Return the address of the data stack position (that is,  the
             value  of the stack pointer) to the top of the stack,  as it
             was before SP@ was executed.

        SPACE              F
             Transmit an ASCII blank to the current output device.

        SPACES     n ---     F
             Transmit  n spaces to the current output  device.   Take  no
             action for n of zero of less.

        SPAN      --- adr        F
             A  variable containing the number of characters input during
             the last EXPECT.

        SS*D     n1 n2 --- d     G
             A  mixed  magnitude math operation which leaves  the  double
             number  signed  product of two  signed  integers.   Warning:
             this name may be changed to S*SD in future releases.














        UNIFORTH VOCABULARY LIST                                Page A-35


        STATE     --- addr     F
             Leave the address of the variable containing the compilation
             state.    A   non-zero  content  indicates  compilation   is
             occurring,   but   the  value  itself  may  be  installation
             dependent.

        SUBROUTINE          U
             A defining word used in the form:
                 SUBROUTINE <name> . . . END-CODE
             to create a machine-language word that is only callable from
             other machine-language words.  It has no code field address.
             Executing  <name>  at a later time puts the address  of  the
             first machine-code instruction on the stack.   <name>  would
             be used like:
             CODE XX . . . <name> CALL, . . . <name> JMP, . . . END-CODE
             by another word.

        SWAP     n1 n2 --- n2 n1     F
             Exchange the top two stack values.

        TERMINAL          U
             Select the system console for further output.

        THEN                 F,I
             Used in a colon-definition in the form:
                   IF . . . ELSE . . . THEN
            or
                   IF . . . THEN
             THEN  is the point where execution resumes after ELSE or  IF
             (when no ELSE is present).

        TIB     --- addr     G
             A user variable containing the address of the terminal input
             buffer.

        TLOAD          ---       U
             Load  the  current file as a text-oriented  file.   (May  be
             called FLOAD in your system).

        TOGGLE     addr b ---     G
             Complement the contents of addr by the bit pattern b.

        TRACE     --- addr     U
             Flag to turn the "unravel" trace on (1) or off(0).

        TRAVERSE     adr1 n --- adr2     G
             Move  across  the name field of a definition.   adr1 is  the
             address  of either the length byte or the last  letter.   If
             n=1,  the motion is toward high memory;  if n=-1, the motion
             is toward low memory.  The adr2 resulting the the address of
             the other end of the name.












        UNIFORTH VOCABULARY LIST                                Page A-36


        TRIAD     n ---     G
             Display on the selected output device the three screens that
             include n,  beginning with a screen that is evenly divisible
             by 3.


        TRUE      --- n               U
             A constant containing the value of a true flag (=-1).

        TRUNK          --- adr        F
             A variable containing the address of the trunk vocabulary.

        TURNKEY     --- adr     U
             The  address  in the kernel COLD routine of the CFA  of  the
             word  SIGNON.   By  replacing  SIGNON  with  a  user-defined
             function, you can autostart any word upon coldstart.

        TYPE     addr n ---     F
             Transmit  n characters beginning at address to  the  current
             output  device.   No  action takes place for n less than  or
             equal to zero.

        U.     un ---     F
             Display  un  converted  according to  BASE  as  an  unsigned
             number, in a free-field format, with one trailing blank. "u-
             dot"

        U2/       ud1 --- ud2              F
             Divide unsigned double by 2.

        U<     un1 un2 --- flag     F
             Leave  the flag representing the magnitude comparison of un1
             <  un2,  where  un1 and un2 are treated at  16-bit  unsigned
             integers.  "u-less-than"

        U<=     un1 un2 --- flag     U
             True if un1 is less than or equal to un2, unsigned.

        U>     un1 un2 --- flag     U
             True if un1 is greater than un2, unsigned.

        U>=     un1 un2 --- flag     U
             True if un1 is greater than or equal to un2, unsigned.

        UM/MOD     ud1 un2 --- un3 un4     F
             Perform  the unsigned division of double number ud1 by  ud2,
             leaving the remainder un3 and quotient un4.   All values are
             unsigned.

        UM/MODD     ud1 u2 --- u3 ud4     G
             An  unsigned mixed magnitude math operation which  leaves  a
             double quotient ud4 and remainder u3, from a double dividend
             ud1 and single divisor u2.










        UNIFORTH VOCABULARY LIST                                Page A-37


        UNPRINT               U
             Prints an informative message for LIST and INDEX.

        UNRAVEL     ---      U
             Trace the return stack nesting, then execute QUIT.

        UNTIL     flag ---     F,I
             Within  a colon-definition,  mark the end of  a  BEGIN-UNTIL
             loop,  which  will  terminate based on a flag.   If flag  is
             true,  the loop is terminated.   If flag is false, execution
             returns  to  the  first  word  after   BEGIN.    BEGIN-UNTIL
             structures may be nested.

        UPPER     adr cnt --          U
             Convert the string to upper case ASCII.

        UPDATE             F
             Mark  the most recently referenced block as  modified.   The
             block will subsequently be automatically transferred to mass
             storage  should its memory buffer be needed for storage of a
             different block, or upon execution of SAVE-BUFFERS.

        US>D     u --- ud     U
             Convert the unsigned 16-bit integer to 32-bit form.

        USE     --- addr     G
             A variable containing the address of the block buffer to use
             next, or in other words, the one least recently written.

        USER     n ---          G
             A defining word used in the form:
                  n USER cccc
             which creates a user variable cccc.   The parameter field of
             cccc  contains  n  as a fixed offset relative  to  the  user
             pointer  register UP for this user variable.   When cccc  is
             later executed, it places the sum of its offset and the user
             area  base  address on the stack as the storage  address  of
             that particular variable.

        USS*D     un1 un2 --- ud3     F
             Perform  an unsigned multiplication of un1 by  un2,  leaving
             the double number product ud3.  All values are unsigned. "u-
             times"

        VARIABLE                F
             A defining word executed in the form:
                       VARIABLE <name>
             to create a dictionary entry for <name> and allot two  bytes
             for  storage in the parameter field.   The application  must
             initialize the stored value.  When <name> is later executed,
             it will place the storage address on the stack.












        UNIFORTH VOCABULARY LIST                                Page A-38


        VECTOR               U
             A defining word used in the form:
                         n VECTOR <name>
             to  create a dictionary entry for <name>,  thereby making  a
             vector n cells long,  presetting all elements to zero.  When
             <name> is later executed, it uses the top stack value  as an
             index  into  the  array  and returns  the  address  of  that
             element. {0..n-1}

        WORDS          G
             List the names of the definitions in the context vocabulary.
             The actuation of any key on the terminal will stop the list.

        VOC-LINK     --- addr     G
             A  user  variable containing the address of a field  in  the
             definition  of  the most recently created  vocabulary.   All
             vocabulary names are linked by these fields to allow control
             for FORGETing through multiple vocabularies.

        VOCABULARY          F
             A defining word used in the form:
                  VOCABULARY <name>
             to create a vocabulary definition <name>.  Subsequent use of
             <name> will make it the CONTEXT vocabulary which is searched
             first by INTERPRET.   The sequence "<name> DEFINITIONS" will
             also  make  <name>  the CURRENT vocabulary  into  which  new
             definitions are placed.  By convention, vocabulary names are
             to be declared IMMEDIATE.  See VOC-LINK.

        WARM           G
             A  warm-start  boot  entry point.   Resets  the  data  stack
             pointer,  but  does  not re-initialize the return  stack  or
             dictionary pointers.

        WARNING     --- addr     G
             A  user  variable  containing a value  controlling  messages
             output  from ?ERROR or MESSAGE.   If WARNING=1,  a  disk  is
             assumed present,  and messages are printed relative to block
             200 of disk drive 0.   If it is equal to zero,  messages are
             not  retrieved from disk;  they are just given numbers.   If
             WARNING= -1, ?ERROR will execute ABORT.

        WHILE     flag ---     F,I,C
             Used in a colon-definition in the form:
                   BEGIN . . . flag WHILE . . . REPEAT
             Select conditional execution based on the flag.   On a  true
             flag,  continue  execution  through to  REPEAT,  which  then
             returns  back to just after BEGIN.   On a false  flag,  skip
             execution to just after REPEAT, exiting the structure.














        UNIFORTH VOCABULARY LIST                                Page A-39


        WIDTH     --- addr     G
             A  user  variable containing the maximum numbers of  letters
             saved in the compilation of a definition's name.  It must be
             1  through  31,  with  a default  value  of  31.   The  name
             character count and its natural characters are saved,  up to
             the  value in WIDTH.   The value may be changed at any  time
             within the above limits.

        WORD     char --- addr     F
             Receive characters from the input stream until the  non-zero
             delimiting  character is encountered or the input stream  is
             exhausted,  ignoring leading delimiters.  The characters are
             stored  as  a packed string with the character count in  the
             first character position.   The actual delimiter encountered
             (char  or  null) is stored at the end of the  text  but  not
             included in the count.  If the input stream was exhausted as
             WORD is called, then a zero length will result.  The address
             of the beginning of this packed string is left on the stack.

        X'     --- n     U
             Interpret  the  next number as decimal,  regardless  of  the
             current base.

        X.     n ---     U
             Display  the number in decimal,  regardless of  the  current
             base.

        XON/XOFF       --- adr        U
             A  variable  that turns on/off  the  ctrl-s/ctrl-q  keyboard
             check.

        XOR     n1 n2 --- n3     F                   "x-or"
             Leave the bitwise exclusive-or of two numbers.

        Y/N       ---  flag          U
             Bring in a yes/no/escape type answer.

        Z.R     n1 n2 ---     U
             Display n1 right justified in n2 columns.   Zero fill to the
             left.  See PLUS?.

        [                      F,I                   "left-bracket"
             End the compilation mode.  The text from the input stream is
             subsequently executed.  See ].

        [']                      F
             Immediate form of tick.

        [COMPILE]              F,I,C                 "bracket-compile"
             Used in a colon-definition in the form:
                   [COMPILE] <name>
             Force compilation of <name>.   This allows compilation of an
             IMMEDIATE   word  when  it  would  otherwise  be   executed.










        UNIFORTH VOCABULARY LIST                                Page A-40


        ]                       F                    "right-bracket"
             Set the compilation mode.  The text from the input stream is
             subsequently compiled.  See [.




























































ee [.




















Directory of PC-SIG Library Disk #0454

 Volume in drive A has no label
 Directory of A:\

FILES454 TXT      1039   2-17-87  12:43a
FORTH    FTH     20480   8-20-85  10:42p
UNIFORTH COM     29696   8-20-85  10:42p
UNIFORTH DOC     87168   8-20-85  10:43p
VEDITOR  FTH     10240   8-20-85  10:43p
WORDS    DOC     93824   8-20-85  10:43p
        6 file(s)     242447 bytes
                       77824 bytes free