home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG023.ARK / STOIC.DOC < prev    next >
Text File  |  1984-04-29  |  46KB  |  1,696 lines

  1.  
  2.  
  3. ***************************************************************************
  4. ** COPYRIGHT (C) MASSACHUSETTS INSTITUTE OF TECHNOLOGY AND HARVARD       **
  5. ** UNIVERSITY, BIOMEDICAL ENGINEERING CENTER 1977.  ALL RIGHTS RESERVED. **
  6. ***************************************************************************
  7.  
  8. STOIC  (STACK ORIENTED INTERACTIVE COMPILER)
  9. J. SACHS
  10. 2/14/77
  11.  
  12.     STOIC IS A GENERAL PURPOSE INTERACTIVE PROGRAM
  13. WHICH INCORPORATES THE CAPABILITIES OF A COMPILER, EDITOR
  14. ASSEMBLER, DEBUGGER, LOADER, AND OPERATING SYSTEM WITHIN
  15. A SINGLE CONSISTENT ARCHITECTURE.  IT IS CORE-EFFICIENT
  16. WHILE RETAINING HIGH RUNNING SPEEDS.  IN ADDITION, THE
  17. LANGUAGE IS EXTREMELY FLEXIBLE, PERMITTING THE USER TO
  18. DEVELOP A WORKING VOCABULARY OF SUBROUTINES TAILORED TO
  19. HIS SPECIFIC APPLICATION.
  20.  
  21.     THE SINGLE MOST PROMINENT FEATURE OF STOIC IS ITS
  22. PRINCIPAL DATA STRUCTURE, CALLED THE DICTIONARY.  THE
  23. DICTIONARY IS AN ORDERED LIST OF ENTRIES CALLED WORDS.
  24. ASSOSCIATED WITH THE DICTIONARY ENTRY FOR EACH WORD IS A
  25. NAME; A LEGAL NAME FOR A WORD IS ANY STRING OF UP TO 127
  26. ASCII CHARACTERS.  PUNCTUATION, NUMERICS, AND MOST OTHER
  27. SPECIAL CHARACTERS MAY BE FREELY USED WITHIN A NAME.  TWO
  28. NAMES ARE EQUIVALENT IF AND ONLY IF THEIR FIRST FIVE CHARACTERS
  29. ARE THE SAME AND THEY HAVE EXACTLY THE SAME LENGTH.  ILLEGAL
  30. CHARACTERS WITHIN A NAME ARE:
  31.  
  32.     SPACE
  33.     TAB
  34.     CARRIAGE RETURN
  35.     FORM FEED
  36.     LINE FEED
  37.     RUBOUT
  38.     NULL
  39.  
  40. EXAMPLES:
  41.  
  42. ABCDE   IS NOT EQUIVALENT TO  ABCDEF
  43. (HEAD1) IS EQUIVALENT TO      (HEAD2)
  44.  
  45.     A LITERAL IS A SEQUENCE OF CHARACTERS WHICH DESCRIBES
  46. A CONSTANT.  THE BASIC STOIC SUPPORTS TWO TYPES OF LITERAL;
  47. 16-BIT INTEGER AND STRING.  THE LANGUAGE MAY BE EXTENDED TO
  48. INCLUDE OTHER DATA TYPES SUCH AS FLOATING POINT OR DOUBLE
  49. PRECISION INTEGER.
  50.  
  51.     AN INTEGER LITERAL IS A SEQUENCE OF DIGITS
  52. OPTIONALLY PRECEDED BY A PLUS OR MINUS SIGN.  ALL DIGITS
  53. MUST BE LESS THAN THE CURRENT RADIX.  NO SPACES MAY BE
  54. EMBEDDED WITHIN THE LITERAL.  INTEGER LITERAL MUST BE IN
  55. THE RANGE OF -32768 TO 32767 IS SIGNED OR 0 TO 65535 IF
  56. UNSIGNED.
  57.  
  58. EXAMPLES:
  59.  
  60. -1234    IS A LEGAL LITERAL
  61. +-100    IS NOT A LEGAL LITERAL
  62. -AFC0    IS A LEGAL LITERAL IF RADIX IS HEXADECIMAL
  63.  
  64.  
  65.     STRING LITERALS MAY TAKE ONE OF THREE FORMS:
  66. 1) A STRING ENCLOSED IN DOUBLE QUOTES:
  67.  
  68.  "STRING"
  69.  
  70. 2) A STRING ENCLOSED IN BACKSLASHES:
  71.  
  72.  \STRING\
  73.  
  74. 3) A STRING PRECEDED BY SINGLE QUOTE AND TERMINATED BY SPACE OR TAB:
  75.  
  76.  'STRING
  77.  
  78. IN ANY OF THE ABOVE TYPES OF STRING LITERAL, THE END OF THE
  79. LINE (RETURN OR FORM FEED) MAY SERVE AS A TERMINATOR.  SPECIAL
  80. CHARACTERS SUCH AS RETURN, RUBOUT, ETC. MAY BE INCLUDED IN A
  81. STRING LITERAL BY ENCLOSING THE CORRESPONDING OCTAL ASCII CODE
  82. BETWEEN TWO AMPERSANDS (&).
  83.  
  84. EXAMPLES:
  85.  
  86. "THIS IS A STRING LITERAL"
  87. \THIS LITERAL CONTAINS A RETURN &15&\
  88. '&177&&15&
  89.  
  90.  
  91.     STOIC SYNTAX IS QUITE SIMPLE.  A LEGAL COMMAND
  92. LINE CONSISTS OF A SEQUENCE OF LITERALS AND/OR NAMES OF WORDS
  93. SEPARATED BY SPACES OR TABS, AND TERMINATED BY CARRIAGE
  94. RETURN OR FORM FEED.
  95.  
  96.     PROGRAMMING IN STOIC CONSISTS PRIMARILY OF
  97. DEFINING A SET OF NEW WORDS BASED ON WORDS WHICH HAVE
  98. ALREADY BEEN DEFINED.  AN INITIAL VOCABULARY OF ABOUT ONE
  99. HUNDRED WORDS CALLED THE KERNEL ENABLES THE USER TO GET
  100. STARTED.
  101.  
  102.     THE PRINCIPAL VEHICLE FOR COMMUNICATION BETWEEN
  103. WORDS IS THE PARAMETER STACK, FREQUENTLY CALLED "THE
  104. STACK".   TYPICALLY, THE PARAMETERS UPON WHICH A WORD WILL
  105. OPERATE ARE PUSHED ON THE STACK, THE WORD POPS ITS
  106. PARAMETERS FROM THE STACK AND PUSHES ITS RESULTS ON THE
  107. STACK.  COMMUNICATION THROUGH VARIABLES IN FIXED
  108. LOCATIONS IS ALSO USED.
  109.  
  110.     STOIC USES REVERSE POLISH NOTATION FOR ALL
  111. OPERATIONS.  THIS MEANS THAT ALL OPERANDS PRECEDE THEIR
  112. OPERATORS;  PARENTHESES ARE NEVER NECESSARY.
  113.  
  114. EXAMPLES:
  115.  
  116. 1 1 + 2 *   IN ALGEBRAIC NOTATION IS   (1+1)*2
  117. 1 2 3 * -   IN ALGEBRAIC NOTATION IS   1-(2*3)
  118.  
  119.     UNLIKE MOST OTHER HIGER LEVEL LANGUAGES, STOIC
  120. ENABLES THE USER TO MANIPULATE ADDRESSES AS WELL AS DATA.
  121. IT IS VERY IMPORTANT HOWEVER FOR THE USER TO REMAIN AWARE
  122. OF THE DISTINCTION BETWEEN AN ADDRESS AND ITS CONTENTS.
  123.     THERE ARE THREE COMMON TYPES OF WORDS WHICH PUSH
  124. NUMBERS ON THE STACK; LITERALS, CONSTANTS, AND VARIABLES.
  125. A REFERENCE TO A LITERAL OR A CONSTANT CAUSES ITS VALUE
  126. TO BE PUSHED ON THE STACK.  A REFERENCE TO A VARIABLE
  127. CAUSES ITS ADDRESS TO BE PUSHED ON THE STACK.  THE TWO
  128. OPERATORS "@" AND "!" ARE USED TO OBTAIN AND MODIFY THE
  129. VALUE OF A VARIABLE.  THEY ARE DEFINED AS FOLLOWS:
  130.  
  131.     @    REPLACE THE ADDRESS ON THE TOP OF THE
  132.         STACK BY THE CONTENTS OF THAT ADDRESS.
  133.         THIS WORD IS USED TO LOAD THE CONTENTS
  134.         OF A MEMORY LOCATION ONTO THE STACK.
  135.  
  136.     !    STORE AT THE ADDRESS ON THE TOP OF THE
  137.         STACK THE NUMBER NEXT TO TOP OF THE
  138.         STACK.  BOTH NUMBERS ARE REMOVED FROM
  139.         THE STACK.
  140.  
  141. EXAMPLES:
  142.  
  143. IN THE FOLLOWING EXAMPLES, X, Y, AND Z ARE VARIABLES,
  144. WHILE A, B, AND C ARE CONSTANTS.
  145.  
  146. 100 X !        SET VALUE OF X TO 100.
  147.  
  148. X 100 !        STORE THE ADDRESS OF X IN LOCATION 100
  149.         (UNDER NORMAL CIRCUMSTANCES, THIS WOULD
  150.         BE A VERY SERIOUS ERROR).
  151.  
  152. X @ Y !        SET THE VALUE OF Y TO THE VALUE OF X
  153.  
  154. X Y !        SET THE VALUE OF Y TO THE ADDRESS OF X
  155.  
  156. X @ Y @ + Z !    ADD THE VALUES OF X AND Y AND STORE THE
  157.         RESULT IN Z.
  158.  
  159. X A + Y !    STORE (ADDRESS OF X)+A IN Y.
  160.  
  161. X A B + + @ Y !    SET VALUE OF Y TO THE CONTENTS OF
  162.         LOCATION X+A+B.
  163.  
  164.  
  165.     STOIC PROVIDES THE USER WITH AN UNUSUALLY LARGE
  166. NUMBER OF FIXED POINT OPERATORS FROM WHICH THE FOLLOWING
  167. MORE COMMON EXAMLES HAVE BEEN EXTRACTED.  UNLESS OTHERWISE
  168. SPECIFIED, ALL NUMBERS ARE 16-BIT INTEGERS.
  169.  
  170. UNARY OPERATORS
  171.  
  172. THE FOLLOWING OPERATORS REPLACE THE TOP OF THE STACK
  173. WITH THEIR RESULT.  THE NUMBER ON THE TOP OF THE
  174. STACK IS CALLED "A".
  175.  
  176.     MINUS    -A
  177.  
  178.     ABS    ABSOLUTE VALUE OF A
  179.  
  180.     NOT    LOGICAL COMPLEMENT OF A
  181.  
  182.     2*    A*2
  183.  
  184.     2/    A/2 (SIGNED)
  185.  
  186.     U2/    A/2 (UNSIGNED)
  187.  
  188.     1+    A+1
  189.  
  190.     1-    A-1
  191.  
  192.     EQZ    -1 IF A EQUAL TO 0
  193.          0 OTHERWISE
  194.  
  195.     NEZ    -1 IF A NOT EQUAL TO 0
  196.          0 OTHERWISE
  197.  
  198.     LTZ    -1 IF A LESS THAN 0
  199.          0 OTHERWISE
  200.  
  201.     LEZ    -1 IF A LESS OR EQUAL TO 0
  202.          0 OTHERWISE
  203.  
  204.     GEZ    -1 IF A GREATER OR EQUAL TO 0
  205.          0 OTHERWISE
  206.  
  207.     GTZ    -1 IF A GREATER THAN 0
  208.          0 OTHERWISE
  209.  
  210. BINARY OPERATORS
  211.  
  212. THE FOLLOWING OPERATORS REPLACE THE TOP TWO NUMBERS ON
  213. THE STACK WITH THEIR RESULT.  THE NUMBER ON THE TOP OF
  214. THE STACK IS CALLED "A", THE NEXT TO TOP IS CALLED "B".
  215.  
  216.     +    B+A
  217.  
  218.     -    B-A
  219.  
  220.     *    B*A
  221.  
  222.     /    B/A
  223.  
  224.     MAX    MAXIMUM (B,A) (SIGNED)
  225.  
  226.     MIN    MINIMUM (B,A) (SIGNED)
  227.  
  228.     AND    LOGICAL AND OF B,A
  229.  
  230.     OR    LOGICAL OR OF B,A
  231.  
  232.     XOR    LOGICAL EXCLUSIVE OR OF B,A
  233.  
  234.     EQ    -1 IF B EQUAL TO A
  235.          0 OTHERWISE
  236.  
  237.     NE    -1 IF B NOT EQUAL TO A
  238.          0 OTHERWISE
  239.  
  240.     LT    -1 IF B LESS THAN A
  241.          0 OTHERWISE
  242.  
  243.     LE    -1 IF B LESS OR EQUAL TO A
  244.          0 OTHERWISE
  245.  
  246.     GE    -1 IF B GREATER OR EQUAL TO A
  247.          0 OTHERWISE
  248.  
  249.     GT    -1 IF B GREATER THAN A
  250.          0 OTHERWISE
  251.  
  252.  
  253.     A NUMBER OF OPERATORS ARE ALSO PROVIDED WHOSE
  254. SOLE FUNCTION IS TO REORGANIZE THE ELEMENTS OF THE STACK:
  255.  
  256.         STACK    STACK
  257.     NAME    BEFORE    AFTER    DESCRIPTION
  258.  
  259.     DUP    A    A    DUPLICATES TOP OF STACK
  260.             A
  261.  
  262.     OVER    A    B    DUPLICATES TOP - 1
  263.         B    A
  264.             B
  265.  
  266.     2OVER    A    C    DUPLICATES TOP - 2
  267.         B    A
  268.         C    B
  269.             C
  270.  
  271.     3OVER    A    D    DUPLICATES TOP - 3
  272.         B    A
  273.         C    B
  274.         D    C
  275.             D
  276.  
  277.     UNDER    A    A    STORES TOP AT TOP - 1
  278.         B
  279.  
  280.     2UNDER    A    B    STORES TOP AT TOP - 2
  281.         B    A
  282.         C
  283.  
  284.     3UNDER    A    B    STORES TOP AT TOP - 3
  285.         B    C
  286.         C    A
  287.         D
  288.  
  289.     DROP    A    B    DISCARDS TOP
  290.         B
  291.  
  292.     2DROP    A    C    DISCARDS TOP 2 STACK ENTRIES
  293.         B
  294.         C
  295.  
  296.     3DROP    A    D    DISCARDS TOP 3 STACK ENTRIES
  297.         B
  298.         C
  299.         D
  300.  
  301.     SWAP    A    B    EXCHANGES TOP AND TOP - 1
  302.         B    A
  303.  
  304.     2SWAP    A    A    EXCHANGES TOP - 1 AND TOP - 2
  305.         B    C
  306.         C    B
  307.  
  308.     FLIP    A    C    EXCHANGES TOP AND TOP - 2
  309.         B    B
  310.         C    A
  311.  
  312.     +ROT    A    B    ROLL TOP 3 STACK ENTRIES UP
  313.         B    C
  314.         C    A
  315.  
  316.     -ROT    A    C    ROLL TOP 3 STACK ENTRIES DOWN
  317.         B    A
  318.         C    B
  319.  
  320.     DDUP    A    A    DUPLICATE THE TOP 2 STACK ENTRIES
  321.         B    B
  322.             A
  323.             B
  324.  
  325. I/O WORDS
  326. "N" IS THE NUMBER ON THE TOP OF THE STACK.
  327.  
  328.     COLUMN    VARIABLE CONTAINING THE CURRENT COLUMN NUMBER
  329.  
  330.     TYO    OUTPUT THE ASCII CHARACTER IN THE RIGHTMOST
  331.         8 BITS OF N.  COLUMN IS INCREMENTED UNLESS THE
  332.         CHARACTER OUTPUT IS A RETURN IN WHICH CASE IT
  333.         IS ZEROED.
  334.  
  335.     CR    OUTPUT A RETURN FOLLOWED BY A LINE FEED.
  336.         COLUMN IS ZEROED.
  337.  
  338.     IFCR    OUTPUTS A RETURN, LINE FEED IF COLUMN IS NON-ZERO.
  339.  
  340.     SPACE    OUTPUT A SPACE.
  341.  
  342.     SPACES    OUTPUT N SPACES.
  343.  
  344.     TAB    TAB TO COLUMN N.  IF ALREADY AT OR BEYOND COLUMN
  345.         N, NOTHING IS OUTPUT.
  346.  
  347.     TYI    INPUT A CHARACTER.
  348.  
  349.     =    OUTPUT N IN THE CURRENT RADIX FOLLOWED BY SPACE.
  350.  
  351.     ?    OUTPUT THE CONTENTS OF THE LOCATION
  352.         ADDRESSED BY N FOLLOWED BY SPACE.
  353.  
  354.     TYPE    OUTPUT N CHARACTERS STARTING AT BYTE
  355.         POINTER AT TOP - 1.
  356.  
  357.  
  358. WORDS WHICH CHANGE THE CURRENT RADIX
  359.  
  360.     OCTAL    SET CURRENT RADIX TO OCTAL
  361.  
  362.     DECIMAL    SET CURRENT RADIX TO DECIMAL
  363.  
  364.     HEX    SET CURRENT RADIX TO HEXADECIMAL
  365.  
  366.  
  367. WORDS USED TO REFERENCE MEMORY LOCATIONS
  368.  
  369. A REPRESENTS THE TOP OF THE STACK, B REPRESENTS
  370. THE NEXT TO TOP.
  371.  
  372.     <-    STORE A AT LOCATION B (SAME AS "!" EXCEPT
  373.         ARGUMENTS ARE REVERSED).
  374.  
  375.     0<-    STORE 0 AT LOCATION A
  376.  
  377.     -1<-    STORE -1 AT LOCATION A
  378.  
  379.     +!    ADD B TO THE CONTENTS OF LOCATION A
  380.  
  381.     1+!    INCREMENT LOCATION A
  382.  
  383.     1-!    DECREMENT LOCATION A
  384.  
  385.     MOVE    COPY THE CONTENTS OF THE LOCATION ADDRESSED
  386.         BY B TO THE LOCATION ADDRESSED BY A.
  387.  
  388.     XCHG    EXCHANGE THE CONTENTS OF LOCATIONS A AND B.
  389.  
  390.     MVBYTES    COPIES BYTES SEQUENTIALLY FROM ONE AREA TO ANOTHER
  391.         BYTE COUNT AT TOP, SOURCE BYTE ADDRESS AT TOP - 2,
  392.         DESTINATION BYTE ADDRESS AT TOP - 1.
  393.  
  394. EXAMPLES:
  395.  
  396. 0> 1 MINUS =
  397. -1
  398.  
  399. 0> -1 ABS =
  400. 1
  401.  
  402. 0> -1 EQZ =
  403. 0
  404.  
  405. 0> 0 EQZ =
  406. -1
  407.  
  408. 0> 1 1 + =
  409. 2
  410.  
  411. 0> 1 1 1 + + =
  412. 3
  413.  
  414. 0> 1 2 3 = = =
  415. 3 2 1
  416.  
  417. 0> 1 2 SWAP = =
  418. 1 2
  419.  
  420. 0> 1 2 DUP = = =
  421. 2 2 1
  422.  
  423. 0> 1 2 1 - EQ =
  424. -1
  425.  
  426. 0> 100 X ! X ?
  427. 100
  428.  
  429. 0> -1 5 MAX =
  430. 5
  431.  
  432. 0> -1 5 MIN =
  433. -1
  434.  
  435.  
  436. COLON DEFINITIONS
  437.  
  438.     STOIC PROVIDES THE CAPABILITY OF DEFINING A NEW
  439. WORD IN TERMS OF PREVIOUSLY DEFINED WORDS BY MEANS OF
  440. THE COLON DEFINITION.  ITS SYNTAX IS AS FOLLOWS:
  441.  
  442. 'NEWWORD : WORD1 WORD2 ... WORDN ;
  443.  
  444.     THIS CREATES A NEW DICTIONARY ENTRY CALLED NEWWORD
  445. WHICH, WHEN EXECUTED, WILL IN TURN EXECUTE WORD1, WORD2,
  446. ... IN SEQUENCE.  AFTER EXECUTING WORDN, IT WILL RETURN.
  447. EACH OF THE WORDS WORD1, WORD2, ... MUST ALREADY EXIST
  448. AS ENTRIES IN THE DICTIONARY.  IF NOT, A FATAL ERROR
  449. MESSAGE OF THE FOLLOWING FORM WILL BE GENERATED:
  450.  
  451. UNDEFINED
  452. (NAME OF UNDEFINED WORD)
  453.  
  454.     A WORD MAY BE REDEFINED AT ANY TIME.  IN THIS
  455. CASE, ALL PRIOR DEFINITIONS WHICH REFERENCED THAT WORD
  456. WILL STILL EXECUTE THE OLD VERSION.  ALL SUBSEQUENT
  457. DEFINITIONS HOWEVER WILL EXECUTE THE MOST RECENTLY
  458. DEFINED VERSION. REDEFINING A WORD WILL GENERATE THE
  459. FOLLOWING WARNING MESSAGE:
  460.  
  461. REDEFINING (NAME OF WORD)
  462.  
  463. EXAMPLES:
  464.  
  465. 'AVERAGE : + 2/ ;
  466.  
  467.     THIS DEFINES THE WORD AVERAGE WHICH COMPUTES
  468.     THE AVERAGE OF THE TOP 2 NUMBERS ON THE STACK.
  469.  
  470.     0> 2 4 AVERAGE =
  471.     3
  472.  
  473. 'SPACE : 40 TYO ;
  474.  
  475.     THIS DEFINES THE WORD "SPACE" WHICH TYPES A SPACE.
  476.     (THE ASCII CODE FOR SPACE IS 40 OCTAL).
  477.  
  478.     IF THE NAME OF A WORD BEING REDEFINED APPEARS
  479. WITHIN THE NEW DEFINITION, ITS OLD MEANING WILL BE USED.
  480. THE PROCEDURE FOR MAKING RECURSIVE CALLS IS DESCRIBED
  481. BELOW UNDER "RECURSION".
  482.  
  483.  
  484. ITERATION
  485.  
  486.     STOIC PROVIDES FIVE MEANS FOR ITERATIVE
  487. EXECUTION OF A SEQUENCE OF WORDS, NAMELY:
  488.  
  489. N ( ... )
  490.  
  491.     EXECUTE THE WORDS INCLUDED IN PARENTHESES N TIMES.
  492.  
  493. BEGIN ... END
  494.  
  495.     EXECUTE WORDS BETWEEN "BEGIN" AND "END" UNTIL A CONDITION
  496.     IS SATISFIED.
  497.  
  498. BEGIN ... IF ... REPEAT
  499.  
  500.     SIMILAR TO BEGIN ... END EXCEPT THE CONDITION
  501.     IS TESTED AT THE BEGINNING OF THE LOOP.
  502.  
  503. DO ... LOOP
  504.  
  505.     EXECUTE THE WORDS BETWEEN "DO" AND "LOOP", RUNNING
  506.     AN INDEX FROM A LOWER TO AN UPPER LIMIT, INCREMENTING
  507.     BY 1 EACH TIME.
  508.  
  509. DO ... N +LOOP
  510.  
  511.     EXECUTE THE WORDS BETWEEN "DO" AND "+LOOP", RUNNING
  512.     AN INDEX FROM A LOWER TO AN UPPER LIMIT, INCREMENTING
  513.     BY N EACH TIME.
  514.  
  515.     ITERATIONS MAY BE NESTED SUBJECT TO THE NORMAL
  516. RESTRICTIONS ON OVERLAPPING RANGES, I.E. ANY ITERATION
  517. WHICH IS INITIATED WITHIN THE RANGE OF ANOTHER ITERATION
  518. MUST BE TERMINATED WITHIN THAT SAME RANGE.
  519.  
  520.  
  521. ( ... )
  522.  
  523.     A SEQUENCE OF WORDS MAY BE EXECUTED REPETITIVELY
  524. USING THE FOLLOWING SYNTAX:
  525.  
  526. N ( WORD1 WORD2 ... WORDN )
  527.  
  528.     THIS CAUSES THE SEQUENCE WORD1, WORD2, ... TO BE
  529. EXECUTED N TIMES WHERE N IS THE NUMBER ON THE TOP OF THE
  530. STACK.  IF N IS ZERO OR NEGATIVE, THE SEQUENCE OF WORDS
  531. IS NOT EXECUTED AT ALL AND CONTROL PASSES TO THE WORD
  532. FOLLOWING THE ")".
  533.  
  534. EXAMPLE:
  535.  
  536. 'DINGDING : 2 ( DING ) ;
  537.  
  538.     THIS DEFINITION IS FUNCTIONALLY EQUIVALENT TO:
  539.  
  540.     'DINGDING : DING DING ;
  541.  
  542.     IN EITHER CASE, EXECUTING "DINGDING" CAUSES THE
  543.     WORD "DING" TO BE EXECUTED TWICE.
  544.  
  545. 'SPACES : ( SPACE ) ;
  546.  
  547.     THIS IS A DEFINITION OF THE WORD "SPACES".
  548.     THUS "20 SPACES" CAUSES "SPACE" TO BE EXECUTED
  549.     20 TIMES.
  550.  
  551.     AN UNSIGNED VERSION OF PARENTHESIS ITERATION IS USED
  552. WHERE THE ITERATION COUNT IS BETWEEN 32767 AND 65535:
  553.  
  554.     N U( ... )
  555.  
  556.  
  557. BEGIN ... END
  558.  
  559.     THE BEGIN ... END SYNTAX PERMITS THE USER TO EXECUTE
  560. A SEQUENCE OF WORDS AND THEN, DEPENDING ON A COMPUTED
  561. LOGICAL VARIABLE, EITHER LOOP BACK OR CONTINUE ON:
  562.  
  563. BEGIN WORD1 WORD2 ... WORDN END
  564.  
  565.     THE SEQUENCE WORD1, WORD2, ... IS EXECUTED ONCE.
  566. WHEN THE "END" IS REACHED, THE TOP OF THE STACK IS
  567. POPPED AND  TESTED.  IF IT IS TRUE (NON-ZERO) THEN
  568. CONTROL PASSES TO THE WORD FOLLOWING "END".  IF IT IS
  569. FALSE (ZERO) CONTROL PASSES BACK TO THE WORD FOLLOWING
  570. "BEGIN".
  571.  
  572. EXAMPLE:
  573.  
  574.     'EXAMPLE : BEGIN 1- DUP DUP = EQZ END DROP ;
  575.  
  576.     THIS DEFINES THE WORD "EXAMPLE" WHICH MIGHT BE
  577.     CALLED AS FOLLOWS:
  578.  
  579.     0> 5 EXAMPLE
  580.     4 3 2 1 0
  581.  
  582.     EACH TIME THROGH THE LOOP, THE TOP OF THE STACK
  583.     (INITIALLY THE NUMBER 5) IS DECREMENTED, PRINTED,
  584.     AND COMPARED TO ZERO.  IF IT IS NOT ZERO, THE
  585.     LOOP IS REPEATED,  WHEN IT BECOMES ZERO, THE LOOP
  586.     TERMINATES.
  587.  
  588.  
  589. BEGIN ... IF ... REPEAT
  590.  
  591.     BEGIN ... IF ... REPEAT IS SIMILAR TO BEGIN ...
  592. END EXCEPT THAT THE TEST IS MADE AT THE BEGINNING OF THE
  593. LOOP RATHER THAN AT THE END.  THE WORDS FROM "BEGIN" TO
  594. "IF" ARE EXECUTED.  IF THE TOP OF THE STACK IS TRUE
  595. (NON-ZERO) THE WORDS BETWEEN "IF" AND "REPEAT" ARE
  596. EXECUTED AND CONTROL THEN PASSES BACK TO THE WORD
  597. FOLLOWING "BEGIN".  IF THE TOP OF THE STACK IS FALSE
  598. (ZERO), CONTROL PASSES TO THE WORD FOLLOWING "REPEAT".
  599.  
  600. EXAMPLE:
  601.  
  602.     BEGIN EOF NOT IF READ-RECORD REPEAT
  603.  
  604.     THIS EXAMPLE MIGHT BE USED TO READ THE CONTENTS
  605.     OF A FILE.  "EOF" RETURNS A -1 IF END OF FILE
  606.     HAS BEEN ENCOUNTERED; A 0 OTHERWISE.  "READ-RECORD"
  607.     READS THE NEXT ENTRY IN THE FILE.  BY TESTING
  608.     FOR EOF AT THE BEGINNING OF THE LOOP, THE
  609.     CASE OF A ZERO-LENGTH FILE IS PROPERLY
  610.     HANDLED.
  611.  
  612.  
  613. DO LOOPS
  614.  
  615.     A DO LOOP FACILITY IS PROVIDED BY STOIC FOR
  616. INDEXING THROUGH A SEQUENCE OF WORDS.  THERE ARE TWO
  617. FORMS OF DO LOOP:
  618.  
  619. HIGH LOW DO WORD1 WORD2 ... WORDN LOOP
  620.  
  621. HIGH LOW DO WORD1 WORD2 ... WORDN INCR +LOOP
  622.  
  623.     THE LIMITS "HIGH" AND "LOW" (THE TOP TWO STACK
  624. ENTRIES) ARE COMPARED.  IF "HIGH" IS LESS THAN OR EQUAL TO
  625. "LOW", CONTROL PASSES TO THE WORD FOLLOWING "LOOP" OR
  626. "+LOOP".  OTHERWISE, THE SEQUENCE WORD1, WORD2, ... IS
  627. EXECUTED.  "LOOP" CAUSES THE LOWER LIMIT ("LOW") TO BE
  628. INCREMENTED BY 1 AND COMPARED TO THE UPPER LIMIT ("HIGH").
  629. IF "LOW" IS EQUAL TO OR GREATER THAN "HIGH", THE LOOP IS
  630. TERMINATED.  OTHERWISE ANOTHER ITERATION IS PERFORMED.
  631. "+LOOP" IS IDENTICAL TO "LOOP" WITH THE EXCEPTION THAT
  632. "LOW" IS INCREMENTED BY THE WORD ON THE TOP OF THE STACK
  633. ("INCR").  "INCR" IS NORMALLY A POSITIVE NUMBER.
  634.  
  635.     WITHIN THE RANGE OF THE LOOP, THE CURRENT VALUE
  636. OF THE LOOP INDEX IS AVAILABLE BY USING THE WORD "I".
  637. IF DO LOOPS ARE NESTED, "I" ALWAYS CONTAINS THE VALUE
  638. OF THE INNERMOST INDEX.  THE NEXT OUTER INDICES ARE
  639. AVAILABLE USING THE WORDS "J" AND "K".  THE WORD "I'"
  640. IS USED TO OBTAIN THE VALUE OF "HIGH"+"LOW"-I-1.  THIS IS
  641. USED TO RUN AN INDEX BACKWARDS FROM "HIGH"-1 TO "LOW".
  642. THE WORDS "J'" AND "K'" ARE SIMILARLY DEFINED.  WHEN
  643. PARENTHESES ARE NESTED WITH "DO" LOOPS, THEY COUNT AS
  644. ONE LEVEL OF INDEXING.  "I" USED WITHIN THE RANGE
  645. OF A PARENTHESIS ITERATION WILL RETURN THE CURRENT VALUE
  646. OF THE ITERATION COUNT (WHICH RUNS FROM ITS INITIAL VALUE
  647. DOWNWARDS TO ONE).
  648.  
  649.     THE WORD "EXIT", CAUSES THE INNERMOST LOOP IN
  650. WHICH IT IS EMBEDDED TO UNCONDITIONALLY TERMINATE ON THE
  651. NEXT CYCLE, WHETHER A DO LOOP OR A PARENTHESIS LOOP.
  652.  
  653. EXAMPLES:
  654.  
  655.     5 0 DO I = LOOP
  656.  
  657.     THIS CUASES THE NUMBERS FROM 0 TO 4 INCLUSIVE
  658.     TO BE TYPED OUT.
  659.  
  660.     5 0 DO 5 0 DO J 5 * I + = LOOP CR LOOP
  661.  
  662.     THIS TYPES OUT THE NUMBERS FROM 0 TO 24
  663.     INCLUSIVE AS 5 LINES OF 5 NUMBERS EACH.
  664.  
  665.     5 0 DO I' = LOOP
  666.  
  667.     THIS TYPES OUT THE NUMBERS FROM 4 TO 0
  668.     INCLUSIVE.
  669.  
  670.     0 21 1 DO I + DUP = 2 +LOOP DROP
  671.  
  672.     THIS TYPES OUT THE FIRST 10 PERFECT SQUARES
  673.     STARTING WITH 1.
  674.  
  675.     WHEN USING "I'" (OR "J'" OR "K'") IN CONJUNCTION WITH
  676. "+LOOP", "HIGH" SHOULD BE REPLACED BY "HIGH"-"INCR"+1, IF IT
  677. IS DESIRED TO PRODUCE THE SAME SET OF INDICES AS WITH "I".
  678. FOR EXAMPLE:
  679.  
  680.     0> 24 0 DO I = 4 +LOOP
  681.     0 4 8 12 16 20
  682.  
  683.     0> 24 0 DO I' = 4 +LOOP
  684.     23 19 15 11 7 3 1
  685.  
  686.     0> 24 4 - 1 + 0 DO I' = 4 +LOOP
  687.     20 16 12 8 4 0
  688.  
  689.     AN UNSIGNED DO LOOP IS USED WHERE THE LIMITS MUST BE
  690. CONSIDERED AS UNSIGNED NUMBERS; E.G. WHERE THE LIMITS ARE BYTE
  691. ADDRESSES IN THE UPPER 32K BYTES OF MEMORY:
  692.  
  693.     HIGH LOW UDO ... ULOOP
  694.     HIGH LOW UDO ... INCR U+LOOP
  695.  
  696.  
  697. CONDITIONALS
  698.  
  699.     STOIC HAS A POWERFUL IF ... ELSE ... THEN CONSTRUCTION
  700. WHICH ALLOWS COMPLICATED LOGICAL TESTS TO BE PERFORMED.
  701. CONDITIONALS MAY BE NESTED, WITH THE SAME RESTRICTIONS
  702. THAT APPLY TO ITERATIONS.
  703.  
  704. FOR THE PURPOSES OF THE CONDITIONAL, "TRUE" IS CONSIDERED
  705. TO BE ANY NON-ZERO VALUE; "FALSE" IS ANY ZERO VALUE.
  706.  
  707. N IF T1 T2 ... TN THEN
  708.  
  709.     THE TOP OF THE STACK, "N" IS TESTED.
  710.  
  711.     IF TRUE (NON-ZERO) THE WORDS T1, T2, ... TN ARE
  712.     EXECUTED.
  713.  
  714.     IF FALSE (ZERO) CONTROL PASSES TO THE WORD
  715.     FOLLOWING "THEN".
  716.  
  717. N IF T1 T2 ... TN ELSE F1 F2 ... FN THEN
  718.  
  719.     THE TOP OF THE STACK, "N" IS TESTED.
  720.  
  721.     IF TRUE (NON-ZERO) THE WORDS T1, T2, ... TN
  722.     ARE EXECUTED; CONTROL THEN PASSES TO THE WORD
  723.     FOLLOWING "THEN".
  724.  
  725.     IF FALSE (ZERO) CONTROL PASSES TO THE WORD
  726.     FOLLOWING "ELSE".  THE WORDS F1, F2, ... FN ARE
  727.     EXECUTED.
  728.  
  729. EXAMPLES:
  730.  
  731.     'ABS : DUP LTZ IF MINUS THEN ;
  732.  
  733.     THIS DEFINES THE WORD "ABS" WHICH REPLACES THE
  734.     TOP OF THE STACK WITH ITS ABSOLUTE VALUE.
  735.  
  736.     'MAX : DDUP GT IF DROP ELSE UNDER THEN ;
  737.  
  738.     THIS DEFINES THE WORD "MAX" WHICH COMPARES THE
  739.     TOP TWO STACK ENTRIES AND LEAVES THE LARGER OF
  740.     THE TWO.
  741.  
  742.  
  743. COMMENTS
  744.  
  745.     THE WORD "%" APPEARING ON A LINE CAUSES THE
  746. REMAINDER OF THAT LINE TO BE IGNORED.  NOTE THAT THE "%",
  747. TO BE RECOGNIZED AS A WORD, MUST BE PRECEDED AND FOLLOWED
  748. BY SPACE OR TAB.
  749.  
  750. EXAMPLES:
  751.  
  752.     X @ Y !        % THIS IS A COMMENT
  753.     %THIS IS NOT A COMMENT
  754.  
  755.  
  756. USING STOIC FROM THE KEYBOARD
  757.  
  758.     WHEN TYPING IN A COMMAND FROM THE KEYBOARD,
  759. THE RUBOUT KEY MAY BE USED TO DELETE THE LAST CHARACTER;
  760. TYPING A NULL DELETES THE ENTIRE COMMAND LINE.
  761.  
  762.     WHEN ACTIVATED, STOIC TYPES A PROMPT MESSAGE
  763. CONSISTING OF THE CURRENT NESTING DEPTH (SEE BELOW)
  764. FOLLOWED BY "> " TO INDICATE THAT IT IS AWAITING KEYBOARD
  765. INPUT.  AT THIS POINT THE OPERATOR TYPES IN A COMMAND LINE.
  766. AS SOON AS RETURN OR FORM FEED IS TYPED, STOIC COMPILES
  767. THE COMMAND LINE AND, IN THE ABSENCE OF COMPILATION ERRORS,
  768. EXECUTES IT.  UPON COMPLETION OF COMMAND EXECUTION, THE
  769. COMPILED CODE FROM THE LAST COMMAND IS DISCARDED AND STOIC
  770. AGAIN TYPES ITS PROMPT MESSAGE AND WAITS FOR THE NEXT COMMAND
  771. LINE.
  772.  
  773.  
  774. NESTING DEPTH AND CONTINUATION LINES
  775.  
  776.     STOIC MAINTAINS A NESTING DEPTH WHICH IS USED
  777. FOR SYNTAX CHECKING AND TO DETERMINE WHEN A MULTI-LINE
  778. COMMAND HAS BEEN COMPLETED AND IS READY TO EXECUTE.
  779. INITIALLY, THE NESTING DEPTH IS SET TO ZERO; IT IS INCREMENTED
  780. WHENEVER ANY OF THE FOLLOWING WORDS ARE ENCOUNTERED DURING
  781. COMPILATION:
  782.  
  783. IF    ELSE    (    U(    BEGIN    DO    :
  784. UDO
  785.  
  786. THE NESTING DEPTH IS DECREMENTED BY THE FOLLOWING WORDS:
  787.  
  788. THEN    ELSE    )    END    LOOP    +LOOP    ;
  789. ULOOP    U+LOOP
  790. REPEAT (DECREMENTS NESTING DEPTH BY 2)
  791.  
  792. IF THE NESTING DEPTH EVER BECOMES NEGATIVE, THE FATAL
  793. ERROR "SYNTAX ERROR" IS GIVEN.  A "SYNTAX ERROR" IS ALSO
  794. GENERATED IF THE NESTING DEPTH IS NON-ZERO EITHER AT THE
  795. BEGINNING OR AT THE END OF A COLON DEFINITION.
  796.  
  797.     AFTER COMPILING A LINE, STOIC CHECKS THE NESTING
  798. DEPTH; IF IT IS ZERO, THE LINE IS EXECUTED, IF NON-ZERO,
  799. IT CONTINUES COMPILATION ON THE NEXT LINE.  FOR EXAMPLE:
  800.  
  801.     0> 3 0 DO
  802.     1> 2 0 DO
  803.     2> I =
  804.     2> LOOP
  805.     1> CR
  806.     1> LOOP
  807.     0 1
  808.     0 1
  809.     0 1
  810.     0>
  811.  
  812. THUS, THE EXECUTION OF THE DO LOOP IS AUTOMATICALLY
  813. POSTPONED UNTIL THE NESTING DEPTH RETURNS TO ZERO,
  814. I.E. WHEN THE "LOOP" MATCHING THE FIRST "DO" IS ENCOUNTERED.
  815. SIMILARLY, A MULTI-LINE COLON DEFINITION IS EXTENDED TO
  816. INCLUDE ALL WORDS UP TO THE MATCHING ";".
  817.  
  818.     EXECUTION OF COMPILED CODE MAY BE POSTPONED
  819. EVEN IF THE NESTING DEPTH IS ZERO BY USING THE WORD
  820. "^".  IF "^" IS USED ANYWHERE ON A LINE, COMPILATION
  821. WILL UNCONDITIONALLY CONTINUE ON TO THE NEXT LINE.
  822. THIS FEATURE MAY BE USED AS FOLLOWS:
  823.  
  824.     0> 5 0 DO I = LOOP ^
  825.     0> 5 0 DO I = LOOP
  826.     0 1 2 3 4 0 1 2 3 4
  827.     0>
  828.  
  829.     A MORE REASONABLE APPLICATION OF "^" INVOLVES
  830. THE USE OF STRING LITERALS.  SINCE COMPILED CODE OUTSIDE
  831. OF A COLON DEFINITION IS DISCARDED AFTER EXECUTION,
  832. STRING LITERALS TYPED IN ON ONE LINE ARE NOT ACCESIBLE TO
  833. SUBSEQUENT LINES UNLESS "^" IS USED TO FORCE THE
  834. COMPILED STRING LITERAL TO BE SAVED.  FOR EXAMPLE:
  835.  
  836. 0> \THIS IS A LONG MESSAGE WHICH USES THE ENTIRE LINE\ ^
  837. 0> MSG
  838. THIS IS A LONG MESSAGE WHICH USES THE ENTIRE LINE
  839. 0>
  840.  
  841. REPEATING THE LAST COMMAND LINE
  842.  
  843.     TYPING A LINE FEED CAUSES STOIC TO RECOMPILE AND RE-EXECUTE
  844. THE LAST COMMAND LINE EXECUTED. FOR EXAMPLE:
  845.  
  846. 0> 2 2 + =
  847. 4
  848. 0>        (LINE FEED TYPED)
  849. 4
  850. 0>        (LINE FEED TYPED)
  851. 4
  852.  
  853.  
  854. ERROR HANDLING
  855.  
  856.     THE FOLLOWING TWO WORDS ARE USED TO HANDLE FATAL
  857. ERRORS IN STOIC:
  858.  
  859.     ABORT    CLEARS THE PARAMETER, RETURN, AND LOOP
  860.         STACKS, RESETS THE NESTING DEPTH TO ZERO,
  861.         AND FORCES CONTROL TO RETURN TO THE
  862.         KEYBOARD.  "ABORT" IS INVOKED BY CONTROL A.
  863.  
  864.     ERR    TYPES THE STRING AT THE TOP OF THE STACK
  865.         FOLLOWED BY THE NAME OF THE WORD LAST
  866.         SCANNED FROM THE INPUT STREAM, AND, IF
  867.         INPUT IS NOT COMING FROM THE KEYBOARD,
  868.         THE LINE LAST COMPILED FROM THE INPUT FILE.
  869.         "ABORT" IS THEN INVOKED TO RESET STOIC.
  870.  
  871.  
  872. DEFINING CONSTANTS, VARIABLES, AND ARRAYS
  873.  
  874. CONSTANTS
  875.  
  876.     A CONSTANT IS A DICTIONARY ENTRY WHICH CAUSES A
  877. 16-BIT INTEGER TO BE PUSHED ON THE PARAMETER STACK.  TO
  878. DEFINE A CONSTANT, THE WORD "CONSTANT" IS USED:
  879.  
  880. VALUE 'NAME CONSTANT
  881.  
  882.     HERE, "VALUE" IS THE NUMBER ON THE TOP OF THE
  883. STACK AND "NAME" IS THE NAME TO BE ASSIGNED TO THE
  884. CONSTANT.
  885.  
  886. EXAMPLE:
  887.  
  888.     5 'NPTS CONSTANT
  889.  
  890.     THIS SETS UP A DICTIONARY ENTRY WITH NAME
  891.     "NPTS".  EXECUTING THE WORD "NPTS" WILL CAUSE
  892.     A 5 TO BE PUSHED ON THE STACK.
  893.  
  894. VARIABLES
  895.  
  896.     A VARIABLE IS A DICTIONARY ENTRY WHICH CONTAINS
  897. A 16-BIT INTEGER AS ITS VALUE.  WHEN EXECUTED, IT CAUSES
  898. THE ADDRESS OF ITS VALUE TO BE PUSHED ON THE PARAMETER
  899. STACK.  VARIABLES ARE DEFINED AS FOLLOWS:
  900.  
  901. VALUE 'NAME VARIABLE
  902.  
  903.     "VALUE" IS THE NUMBER ON THE TOP OF THE STACK
  904. AND "NAME" IS THE NAME TO BE ASSIGNED TO THE VARIABLE.
  905. "VALUE" IS USED TO SET THE INITIAL VALUE OF THE VARIABLE.
  906.  
  907. EXAMPLE:
  908.  
  909.     100 'X VARIABLE
  910.  
  911.     THIS DEFINES A VARIABLE "X" WITH AN INITIAL
  912.     VALUE OF 100.
  913.  
  914.  
  915. ARRAYS
  916.  
  917.     WHILE STOIC DOES NOT HAVE A BUILT-IN ARRAY
  918. HANDLING FACILITY, ITS ABILITY TO PERFORM ADDRESS
  919. ARITHMETIC MAKES SUBSCRIPTING POSSIBLE.  THERE
  920. ARE SEVERAL METHODS FOR SETTING ASIDE STORAGE FOR
  921. AN ARRAY.  THE SIMPLEST IS TO USE THE WORD "ARRAY":
  922.  
  923.     LENGTH 'NAME ARRAY
  924.  
  925.     THIS DEFINES AND ZEROS AN ARRAY WHOSE LENGTH (IN
  926.     16-BIT WORDS) AND NAME ARE SPECIFIED.  THE ARRAY IS
  927.     JUST A VARIABLE WITH EXTRA STORAGE LOCATIONS
  928.     RESERVED.  REFERENCING AN ARRAY THUS CAUSES
  929.     THE ADDRESS OF THE ZEROTH ELEMENT TO BE PUSHED.
  930.  
  931.     EXAMPLE:
  932.  
  933.     100 'BUFFER ARRAY
  934.  
  935.     THIS DEFINES AND ZEROES A 100-WORD ARRAY NAMED
  936.     "BUFFER".
  937.  
  938.     AN EXAMPLE OF A CONVENIENT TECHNIQUE FOR
  939.     DEFINING SMALL ARRAYS IS :
  940.  
  941.     0 '3VEC VARIABLE 1 , 2 ,
  942.  
  943.     THIS DEFINITION SETS UP A 3-VECTOR CALLED "3VEC"
  944.     WHOSE INITIAL VALUE IS (0,1,2).  THE WORD ","
  945.     TAKES A NUMBER FROM THE TOP OF THE STACK AND
  946.     APPENDS IT TO THE END OF THE DICTIONARY,
  947.     AUTOMATICALLY EXTENDING THE LENGTH OF THE
  948.     MOST RECENT DEFINITION.  THIS SERVES THE
  949.     DUAL FUNCTIONS OF RESERVING SPACE IN THE
  950.     DICTIONARY AND INITIALIZING THE ARRAY.
  951.  
  952.  
  953. THE CONTENTS OF AN ARRAY MAY BE INITIALIZED TO ZERO OR
  954. ANY CONSTANT VALUE USING THE FOLLOWING WORDS:
  955.  
  956.     FILL    FILLS AN ARRAY WHOSE ADDRESS IS AT TOP-2
  957.         AND HAS LENGTH (IN WORDS) AT TOP-1 WITH THE
  958.         CONSTANT VALUE AT TOP.
  959.  
  960.     0FILL    ZERO FILLS AN ARRAY WHOSE ADDRESS IS AT
  961.         TOP-1 AND HAS LENGTH (IN WORDS) AT TOP.
  962.  
  963.     EXAMPLE:
  964.  
  965.     100 'X ARRAY
  966.     X 100 -1 FILL
  967.  
  968.     THIS DEFINES A 100-WORD ARRAY "X" WHICH IS THEN
  969.     FILLED WITH -1'S.  EQUIVALENTLY, THE SAME ACTION
  970.     IS PERFORMED BY:
  971.  
  972.     -1 'X VARIABLE 99 ( -1 , )
  973.  
  974.  
  975. REFERENCING ARRAY ELEMENTS
  976.  
  977.     TO REFERENCE AN ELEMENT OF AN ARRAY, ALL THAT IS
  978. NECESSARY IS TO ADD AN APPROPRIATE OFFSET TO THE ADDRESS
  979. OF THE ZEROTH ELEMENT.  NOTE THAT SINCE THE FIRST ELEMENT
  980. HAS OFFSET ZERO, THE NTH ELEMENT HAS OFFSET N-1.
  981.  
  982. EXAMPLE:
  983.  
  984.     10 'X ARRAY
  985.     10 0 DO I X I 2* + ! LOOP
  986.  
  987.     THE ABOVE CODE DEFINES A 10 ELEMENT ARRAY "X"
  988.     AND FILLS IT WITH THE NUMBERS 0 TO 9.
  989.  
  990.     NOTE THAT SINCE ADDRESSES ARE IN BYTES, THE
  991.     INDEX MUST BE MULTIPLIED BY 2.
  992.  
  993.     MULTIDIMENSIONAL SUBSCRIPTING IS HANDLED IN A
  994. SIMILAR FASHION.
  995.  
  996. EXAMPLE:
  997.  
  998.     100 'X ARRAY
  999.     10 0 DO 10 0 DO I J + J 10 * I + 2* X + ! LOOP LOOP
  1000.  
  1001.     THIS EXAMPLE SETS UP A 100 ELEMENT ARRAY "X"
  1002.     WHICH IS TREATED AS A 10 BY 10 MATRIX AND
  1003.     THEN STORES I+J IN THE ELEMENT (I,J).
  1004.  
  1005.  
  1006. THE DICTIONARY
  1007.  
  1008.     THE DICTIONARY STARTS IN LOW CORE AND GROWS
  1009. UPWARD TOWARD THE TOP OF MEMORY.  EACH DEFINITION, AS
  1010. IT IS MADE, IS APPENDED TO THE END OF THE DICTIONARY.
  1011. THE VARIABLE ".D" IS A POINTER TO THE FIRST FREE WORD
  1012. FOLLOWING THE END OF THE DICTIONARY.
  1013.  
  1014. THE WORD "." PUSHES THE VALUE OF THE DICTIONARY
  1015. POINTER (".D") AND IS EQUIVALENT TO TYPING ".D @".
  1016.  
  1017.     THE ADDRESS OF A DICTIONARY ENTRY MAY BE
  1018. OBTAINED BY INVOKING THE FOLLOWING WORD:
  1019.  
  1020.     () NAME
  1021.  
  1022.         PUSHES ON THE STACK THE ADDRESS OF
  1023.         THE PARAMETER FIELD OF THE NAMED
  1024.         WORD.
  1025.  
  1026.     THIS WORD MAKES IT POSSIBLE TO MODIFY THE
  1027.     VALUE OF A CONSTANT.  FOR EXAMPLE:
  1028.  
  1029.     100 'N CONSTANT
  1030.     200 () N !
  1031.  
  1032.     THE FIRST LINE DEFINES A CONSTANT "N" WHOSE
  1033.     VALUE IS 100.  THE NEXT LINE RESETS THE VALUE
  1034.     TO 200.
  1035.  
  1036.     THIS FEATURE SHOULD NOT BE USED IN ANY PROGRAM
  1037.     WHICH WILL SUBSEQUENTLY BE COMMITTED TO READ-
  1038.     ONLY MEMORY.
  1039.  
  1040.     THE FOLLOWING WORD IS USED TO OBTAIN THE
  1041.     ADDRESS OF A WORD IN THE DICTIONARY GIVEN
  1042.     ITS NAME:
  1043.  
  1044.     ADDRESS        TAKES A STRING ARGUMENT ON
  1045.             THE STACK WHICH IS LOOKED
  1046.             UP IN THE DICTIONARY.  IF
  1047.             NOT FOUND, AN ERROR MESSSAGE
  1048.             IS TYPED.  IF FOUND, THE ADDRESS
  1049.             OF THE PARAMETER FIELD OF THE
  1050.             WORD IS RETURNED ON THE STACK.
  1051.  
  1052.     EXAMPLE:
  1053.  
  1054.     'NEWVAL : ADDRESS 200 SWAP ! ;
  1055.  
  1056.     THIS DEFINES A WORD "NEWVAL" WHICH SETS THE
  1057.     PARAMETER FIELD OF ITS ARGUMENT TO 200.
  1058.     THUS,
  1059.  
  1060.     'N NEWVAL
  1061.  
  1062.     IS EQUIVALENT TO THE PREVIOUS EXAMPLE.
  1063.  
  1064.  
  1065. EXECUTING PROGRAMS
  1066.  
  1067.     STOIC PROGRAMS ARE STORED AS ASCII SOURCE
  1068. FILES.  EXECUTING A FILE CAUSES STOIC TO ACCEPT ITS
  1069. COMMANDS FROM THE FILE INSTEAD OF THE KEYBOARD.
  1070. FILE EXECUTION IS CONTROLLED BY THE FOLLOWING WORDS:
  1071.  
  1072.     LOAD    EXECUTE A PROGRAM; ADDRESS OF NAME IS
  1073.         ON TOP OF STACK.
  1074.  
  1075.     ;F    TERMINATES EXECUTION OF THE CURRENT FILE
  1076.         AND RETURNS CONTROL TO THE CALLING INPUT
  1077.         FILE OR TO THE SYSTEM KEYBOARD.
  1078.  
  1079. SINCE STOIC USES THE LOOP STACK TO SAVE CERTAIN INTERPRETER
  1080. VARIABLES WHEN EXECUTING "LOAD", NO EXECUTED FILE MAY
  1081. PUSH ANYTHING ON THE LOOP STACK THAT IS NOT REMOVED WITHIN
  1082. THAT SAME FILE.  "LOAD" WORKS BY MODIFYING THE STOIC READ-
  1083. NEXT-LINE ROUTINE SO THAT IT ACCEPTS INPUT FROM THE SPECIFIED
  1084. FILE INSTEAD OF THE KEYBOARD.  THUS, "LOAD" DOES NOT CAUSE
  1085. THE CONTENTS OF THE FILE TO BE EXECUTED UNTIL THE CURRENT
  1086. LINE HAS BEEN EXECUTED.
  1087.  
  1088. EXAMPLES:
  1089.  
  1090.     'DEFS LOAD
  1091.  
  1092.     THIS EXECUTES A FILE CALLED "DEFS"
  1093.  
  1094.     'LDDEFS : . = 'DEFS LOAD ;
  1095.  
  1096.     THIS DEFINES "LDDEFS" WHICH TYPES OUT THE
  1097.     CURRENT VALUE OF THE DICTIONARY POINTER AND
  1098.     EXECUTES "DEFS".
  1099.  
  1100.     'A LOAD 'B LOAD 'C LOAD
  1101.  
  1102.     THIS COMMAND LINE CAUSES ONLY THE CONTENTS OF FILE
  1103.     "C" TO BE EXECUTED AND LEAVES SEVERAL EXTRANEOUS
  1104.     NUMBERS ON THE LOOP STACK.  MULTIPLE LOADS MAY NOT
  1105.     BE EXECUTED FROM THE SAME COMMAND LINE; THEY MUST
  1106.     BE SEPARATED BY CARRIAGE RETURNS.  THUS, THE CORRECT
  1107.     WAY TO LOAD THE THREE FILES IS:
  1108.  
  1109.     'A LOAD
  1110.     'B LOAD
  1111.     'C LOAD
  1112.  
  1113.  
  1114. STOIC FILE SYSTEM
  1115.  
  1116.     THE STOIC FILE SYSTEM SUPPORTS CONTIGUOUS FILES WHICH
  1117. ARE REFERENCED BY SIX-LETTER NAMES.  THESE NAMES AND THE LOCATIONS
  1118. OF THE FILES ON THE STORAGE MEDIUM ARE STORED IN A DIRECTORY
  1119. WHICH OCCUPIES BLOCK ZERO.  NEW FILES ARE ALWAYS ADDED AT THE
  1120. END OF THE MEDIUM.  THE BLOCKS TAKEN UP BY A FILE WHICH HAS BEEN
  1121. DELETED ARE NOT AVAILABLE UNTIL THE WORD "SQUASH" HAS BEEN EXECUTED.
  1122. "SQUASH" SLIDES ALL THE FILES DOWN AND RESTRUCTURES THE DIRECTORY
  1123. TO ELIMINATE ALL GAPS.  THE FOLLOWING WORDS CONTROL DIRECTORY
  1124. MAINTENANCE AND FILE ACCESS:
  1125.  
  1126. ZERO-DIRECTORY    INITIALIZES THE DIRECTORY.  THE PREVIOUS CONTENTS
  1127.         OF THE DIRECTORY ARE LOST.
  1128.  
  1129. LIST-DIRECTORY    TYPES A DIRECTORY LISTING IN TWO COLUMNS.
  1130.  
  1131. LEFT        RETURNS ON THE STACK THE NUMBER OF UNUSED BLOCKS
  1132.         ON THE STORAGE MEDIUM.
  1133.  
  1134. CCONT        CREATES A CONTIGUOUS FILE WHOSE LENGTH (IN BLOCKS)
  1135.         IS AT THE TOP OF THE STACK, THE NAME IS AT TOP - 1.
  1136.  
  1137. DELETE        DELETES THE FILE WHOSE NAME IS AT TOP OF STACK.
  1138.  
  1139. RENAME        RENAMES FILE WHOSE NAME IS AT TOP - 1 TO NAME AT TOP.
  1140.  
  1141. FILE        CREATES A 3-WORD FILE CONTROL TABLE WHOSE NAME IS AT
  1142.         TOP.  WHEN REFERENCED, THE ADDRESS OF THE FILE CONTROL
  1143.         TABLE IS STORED IN THE VARIABLE "FCT".  THIS CAUSES
  1144.         THE FILE CONTROL TABLE TO BECOME THE CURRENT FILE
  1145.         CONTROL TABLE.
  1146.  
  1147. OPEN        OPENS THE FILE WHOSE NAME IS AT TOP USING THE CURRENT
  1148.         FILE CONTROL TABLE.  THE NUMBER OF THE FIRST BLOCK OF
  1149.         THE FILE IS STORED IN THE FIRST WORD OF THE FILE CONTROL
  1150.         TABLE AND THE OTHER TWO WORDS ARE ZEROED.
  1151.  
  1152. WOPEN        OPENS A FILE FOR WRITING; FILE NAME AT TOP OF STACK.
  1153.         ANY PREVIOUS VERSION OF THE FILE IS DELETED, A NEW
  1154.         VERSION IS CREATED WHOSE LENGTH IS EQUAL TO THE ENTIRE
  1155.         REMAINING FREE SPACE, AND THE FILE IS OPENED USING
  1156.         THE CURRENT FILE CONTROL TABLE.  IF MORE THAN ONE
  1157.         OUTPUT FILE IS ACTIVE AT A TIME, ALL BUT ONE OF THEM
  1158.         MUST BE CREATED WITH "CCONT" AND OPENED WITH "OPEN",
  1159.         GIVING THE FILE LENGTH IN ADVANCE.  THE LAST ONE MAY
  1160.         BE VARIABLE LENGTH AND OPENED WITH "WOPEN".
  1161.  
  1162. SHRINK        USING THE CURRENT FILE CONTROL TABLE, THE END OF
  1163.         THE DIRECTORY IS MOVED DOWN TO THE FIRST FREE BLOCK
  1164.         FOLLOWING THE CURRENT FILE.  THIS WORD IS USED ONLY
  1165.         WITH FILES WHICH HAVE BEEN OPENED USING "WOPEN" TO
  1166.         RELEASE WHATEVER STORAGE IS NOT USED BY THE OUTPUT
  1167.         FILE.
  1168.  
  1169. CLOSE        ZEROES THE FIRST WORD OF THE CURRENT FILE CONTROL
  1170.         TABLE, SIGNALLING IT AS INACTIVE.
  1171.  
  1172. GETBYTE        USING THE CURRENT FILE CONTROL TABLE,
  1173.         RETURNS THE NEXT BYTE FROM THE FILE.
  1174.  
  1175. GETBYTES    USING THE CURRENT FILE CONTROL TABLE, AND TAKING
  1176.         A BYTE COUNT AT TOP AND A BUFFER ADDRESS AT TOP - 1,
  1177.         THE SPECIFIED NUMBER OF BYTES ARE READ FROM THE FILE
  1178.         INTO THE BUFFER.
  1179.  
  1180. PUTBYTE        USING THE CURRENT FILE CONTROL TABLE,
  1181.         STORES BYTE AT TOP IN NEXT BYTE OF FILE.
  1182.  
  1183. PUTBYTES    USING THE CURRENT FILE CONTROL TABLE, AND TAKING
  1184.         A BYTE COUNT AT TOP AND A BUFFER ADDRESS AT TOP - 1,
  1185.         THE SPECIFIED NUMBER OF BYTES ARE WRITTEN INTO THE FILE
  1186.         FROM THE BUFFER.
  1187.  
  1188. GPOS        USING THE CURRENT FILE CONTROL TABLE,
  1189.         RETURNS A DOUBLE PRECISION INTEGER FILE POSITION
  1190.         AT TOP AND TOP - 1.  (MOST SIGNIFICANT WORD AT TOP).
  1191.  
  1192. SPOS        USING THE CURRENT FILE CONTROL TABLE
  1193.         SETS THE FILE POSITION TO THE DOUBLE PRECISION
  1194.         INTEGER VALUE AND TOP AND TOP - 1.
  1195.  
  1196. EXIST        SEARCHES THE DIRECTORY FOR THE NAME AT TOP.  IF
  1197.         FOUND, THE ADDRESS OF THE DIRECTORY ENTRY IS LEFT AT
  1198.         TOP.  IF NOT FOUND, THE ERROR "FILE DOES NOT EXIST"
  1199.         IS GIVEN.
  1200.  
  1201. NOT-EXIST    SEARCHES THE DIRECTORY FOR THE NAME AT TOP.  IF
  1202.         FOUND, THE ERROR "FILE ALREADY EXISTS" IS GIVEN.
  1203.  
  1204. OPEN?        GIVES THE MESSAGE "FILE NOT OPEN" IF THE
  1205.         CURRENT FILE CONTROL TABLE IS NOT OPEN.
  1206.  
  1207. FSQUASH        REMOVES DELETED ENTRIES FROM THE END OF THE
  1208.         DIRECTORY.  DELETED ENTRIES WITHIN THE
  1209.         DIRECTORY ARE NOT AFFECTED.  FSQUASH IS
  1210.         CALLED AUTOMATICALLY AFTER A "DELETE".
  1211.  
  1212. SQUASH        REMOVES ALL DELETED ENTRIES FROM THE DIRECTORY.
  1213.         THE REMAINING FILES ARE MOVED DOWN TO FILL UP
  1214.         THE EMPTY SPACE.
  1215.  
  1216. SEARCH        SEARCHES THE DIRECTORY FOR THE NAME AT TOP.  IF
  1217.         FOUND, A -1 IS RETURNED AT TOP AND A POINTER TO
  1218.         THE DIRECTORY ENTRY AT TOP - 1.  IF NOT FOUND,
  1219.         A ZERO IS LEFT AT TOP.
  1220.  
  1221. DIRECTORY    RETURNS ON THE TOP OF THE STACK THE ADDRESS OF
  1222.         THE FIRST BYTE OF A BUFFER CONTAINING THE
  1223.         DIRECTORY.
  1224.  
  1225. SLOT        RETURNS THE ADDRESS OF THE END-OF DIRECOTRY ENTRY
  1226.         IN THE DIRECTORY BUFFER.
  1227.  
  1228. SBLK        GIVEN THE ADDRESS OF A DIRECTORY ENTRY AT TOP, RETURNS
  1229.         THE STARTING BLOCK NUMBER FOR THE FILE.
  1230.  
  1231. PRINT        TYPES OUT ON THE SYSTEM CONSOLE THE CONTENTS OF THE
  1232.         FILE WHOSE NAME IS AT TOP.
  1233.  
  1234. COPY        COPIES THE FILE WHOSE NAME IS AT TOP - 1 TO A FILE
  1235.         WHOSE NAME IS AT TOP.  THE DESTINATION FILE IS CREATED
  1236.         AT THE END OF THE DIRECTORY; ANY PREVIOUS VERSION IS
  1237.         DELETED.
  1238.  
  1239.  
  1240. DIRECTORY ENTRY FORMAT:
  1241.  
  1242. WORD    CONTENTS
  1243.  
  1244. 0    1ST WORD OF NAME
  1245.      (= -1 IF DELETED)
  1246.      (=  0 IF END OF DIRECTORY)
  1247.  
  1248. 1    2ND WORD OF NAME
  1249.  
  1250. 2    3RD WORD OF NAME
  1251.  
  1252. 3    NUMBER OF FIRST BLOCK OF FILE
  1253.      (NUMBER OF FIRST FREE BLOCK IF 1ST WORD = 0)
  1254.  
  1255.  
  1256. FILE CONTROL TABLE FORMAT:
  1257.  
  1258. WORD    CONTENTS
  1259.  
  1260. 0    NUMBER OF FIRST BLOCK OF FILE
  1261.     (= 0 IF NOT OPEN)
  1262.  
  1263. 1    CURRENT RELATIVE BLOCK NUMBER
  1264.  
  1265. 2    CURRENT RELATIVE BYTE NUMBER WITHIN CURRENT BLOCK
  1266.  
  1267.  
  1268. BASIC BLOCK I/O WORDS
  1269.  
  1270.     THE FILE SYSTEM IS BUILT ON A SET OF LOWER LEVEL WORDS
  1271. WHICH MAY BE USED DIRECTLY BY THE USER TO PERFORM OPERATIONS
  1272. ON BLOCKS OF STORAGE:
  1273.  
  1274. L M N RDBLKS    READS N BLOCKS STARTING AT BLOCK M INTO MEMORY
  1275.         STARTING AT LOCATION L.
  1276.  
  1277. L M N WRBLKS    WRITES N BLOCKS STARTING AT BLOCK M FROM MEMORY
  1278.         STARTING AT LOCATION L.
  1279.  
  1280. BUFFER HANDLING WOWRS
  1281.  
  1282.     STOIC MAINTAINS A POOL OF SYSTEM BUFFERS WHICH ARE
  1283. USED TO HOLD BLOCKS FROM THE STORAGE MEDIUM IN MEMORY.  THEY
  1284. ARE ALLOCATED USING A "LEAST RECENTLY USED" ALGORITHM.
  1285.  
  1286. RBLOCK    RETURNS THE ADDRESS OF A BUFFER CONTAINING THE BLOCK
  1287.     WHOSE NUMBER IS AT TOP.  WHEN A BLOCK IS REQUESTED USING
  1288.     "RBLOCK", IF THE SPECIFIED BLOCK IS ALREADY IN MEMORY,
  1289.     ITS ADDRESS IS IMMEDIATELY RETURNED.  IF IT IS NOT IN
  1290.     MEMORY, THE LEAST RECENTLY USED BUFFER IS FREED (I.E.
  1291.     WRITTEN OUT IF MODIFIED), AND THE BLOCK IS READ IN.
  1292.  
  1293. WBLOCK    RETURNS THE ADDRESS OF A BUFFER CONTAINING THE BLOCK
  1294.     WHOSE NUMBER IS AT TOP.  THE BUFFER IS FLAGGED AS
  1295.     MODIFIED.  IF THE BLOCK IS NOT ALREADY IN MEMORY, IT
  1296.     IS NOT READ IN.
  1297.  
  1298. FLUSH    WRITES OUT ALL MODIFIED BUFFERS.  THIS WORD MUST BE
  1299.     EXECUTED BEFORE SHUTTING DOWN THE SYSTEM OR CHANGING
  1300.     MEDIA TO ENSURE THAT THE INFORMATION ON THE STORAGE
  1301.     MEDIUM IS CURRENT.
  1302.  
  1303. EBUF    FLAGS ALL BUFFERS AS EMPTY.  THIS WORD MUST BE USED
  1304.     WHEN CHANGING MEDIA.
  1305.  
  1306. UPDATE    FLAGS THE MOST RECENTLY ACCESSED BUFFER AS MODIFIED.
  1307.     WHENEVER THE VALUE OF ANY WORD WITHIN AN I/O BUFFER
  1308.     IS MODIFIED, THIS WORD MUST BE CALLED, OTHERWISE THE
  1309.     MODIFIED VERSION WILL NOT BE WRITTEN BACK ON THE
  1310.     STORAGE MEDIUM.
  1311.  
  1312.  
  1313. SAVING AND RESTORING CORE IMAGES
  1314.  
  1315.     TWO WORDS ARE PROVIDED WITHIN THE KERNEL WHICH
  1316. ENABLE THE USER TO SAVE A "SNAPSHOT" OF THE DICTIONARY AND
  1317. ALL STOIC VARIABLES IN A FILE AND, AT A LATER TIME, TO
  1318. RESTORE THE SAVED STATE OF MACHINE AND RESUME EXECUTION.
  1319. THEIR USE IS OUTLINED BELOW:
  1320.  
  1321.     'FILE WRCI    WRITE A CORE IMAGE INTO THE NAMED FILE
  1322.  
  1323.     'FILE RDCI    READ A CORE IMAGE FROM THE NAMED FILE
  1324.  
  1325.     THE CONTENTS OF THE I/O BUFFERS ARE NOT SAVED AS PART
  1326. OF THE CORE IMAGE FILE, BUT ALL OTHER VARIABLES USED BY THE KERNEL,
  1327. THE CONTENTS OF ALL STACKS, THE INTERRUPT DISPATCH TABLE, AND ALL
  1328. USER DEFINITIONS ARE TRANSFERRED.
  1329.  
  1330.     CORE IMAGE FILES MUST BE REGENERATED WHENEVER A NEW VERSION
  1331. OF THE KERNEL IS USED SINCE THE NEW USER DEFINITIONS REFERENCE
  1332. ABSOLUTE LOCATIONS WITHIN THE KERNEL.
  1333.  
  1334.     TO GENERATE A BOOTSTRAPPABLE FILE CONTAINING THE STOIC KERNEL
  1335. PLUS ALL CURRENT USER DEFINITIONS, THE FOLLOWING COMMAND IS USED:
  1336.  
  1337.     'FILE WRITE-BOOT    WRITES A BOOTSTRAP FILE.
  1338.  
  1339. THE BOOTSTRAP FILE CAN THEN BE LOADED DIRECTLY BY THE BOOTSTRAP BY
  1340. RESPONDING WITH THE FILENAME TO THE INITIAL PROMPT.
  1341.  
  1342.  
  1343. STRING HANDLING
  1344.  
  1345.     STOIC STRINGS ARE STORED IN MEMORY IN THE
  1346.     FOLLOWING FORMAT:
  1347.  
  1348.     <LENGTH>STRING<0>
  1349.  
  1350.     THE LENGTH BYTE DOES NOT INCLUDE THE TERMINATING
  1351.     NULL.  THE STRING MAY INCLUDE NULLS BEFORE THE
  1352.     FINAL ONE.  THE LENGTH FIELD MUST BE LESS THAN
  1353.     128 DECIMAL.
  1354.  
  1355.     EXAMPLE:
  1356.  
  1357.     <4>ABCD<0>
  1358.  
  1359.     THIS IS THE INTERNAL REPRESENTATION OF THE
  1360.     STRING "ABCD".
  1361.  
  1362.     EXECUTING A STRING LITERAL CAUSES A POINTER TO
  1363. THE FIRST BYTE OF THE STRING TO BE PUSHED ON THE STACK.
  1364. THIS POINTER MAY BE CONVERTED INTO BYTE-POINTER,
  1365. BYTE-COUNT FORM BY USING THE WORD "COUNT" DESCRIBED
  1366. BELOW.
  1367.  
  1368. COUNT
  1369.  
  1370.     "COUNT" TAKES A POINTER TO A STRING AS INPUT ON
  1371. THE STACK AND LEAVES THE LENGTH OF THE STRING ON THE TOP
  1372. OF THE STACK, AND A BYTE POINTER TO THE FIRST CHARACTER
  1373. FOLLOWING THE LENGTH BYTE AT TOP - 1.
  1374.  
  1375. MSG
  1376.  
  1377.     THE WORD "MSG" IS EQUIVALENT TO "COUNT TYPE".
  1378.     GIVEN A POINTER TO A STRING AT TOP, IT CAUSES
  1379.     THE STRING TO BE TYPED.
  1380.  
  1381. S,
  1382.  
  1383.     "S," TAKES A STRING ARGUMENT ON THE TOP OF THE STACK
  1384.     AND COPIES THE STRING ONTO THE END OF THE DICTIONARY.
  1385.     THE END OF THE DICTIONARY IS EXTENDED TO PERMANENTLY
  1386.     INCLUDE THE STRING.
  1387.  
  1388.  
  1389. EXAMPLES:
  1390.  
  1391.     'LARK : 'NONSENSE MSG ;
  1392.  
  1393.     EXECUTING "LARK" CAUSES "NONSENSE" TO BE TYPED.
  1394.  
  1395.  
  1396. NUMBER OUTPUT CONVERSION
  1397.  
  1398.     STOIC PREFORMS NUMBER CONVERSION USING A SMALL
  1399. BUT POWERFUL SET OF WORDS WHICH PERMIT A WIDE VARIETY OF
  1400. OUTPUT FORMATS TO BE GENERATED.  NUMBER CONVERSION
  1401. PROCEEDS FROM RIGHT TO LEFT, CONVERTING ONE DIGIT AT A TIME.
  1402. THE CONVERSION TAKES PLACE IN THE CURRENT RADIX.  DIGITS
  1403. ARE STORED IN A TEMPORARY AREA AT THE END OF THE DICTIONARY
  1404. SET UP BY "<#".
  1405.  
  1406. RADIX    VARIABLE WHICH CONTAINS CURRENT INPUT AND
  1407.     OUTPUT RADIX.
  1408.  
  1409. <#    INITIATE NUMBER CONVERSION.
  1410.  
  1411. #PUT    OUTPUT A CHARACTER FROM TOP OF STACK.
  1412.  
  1413. #A    CONVERT THE NUMBER ON THE TOP OF THE STACK
  1414.     TO AN ASCII DIGIT.
  1415.  
  1416. #    COMPUTE THE NEXT DIGIT AND OUTPUT IT.
  1417.     AN INTEGER IS INPUT FROM THE TOP OF THE STACK
  1418.     AND DIVIDED BY "RADIX".  THE REMAINDER IS
  1419.     CONVERTED TO A DIGIT AND OUTPUT; THE
  1420.     QUOTIENT REMAINS ON THE STACK.
  1421.  
  1422. #S    COMPUTE DIGITS AND OUTPUT THEM UNTIL THE
  1423.     REMAINING NUMBER IS ZERO.  "#S" ALWAYS OUTPUTS
  1424.     AT LEAST ONE DIGIT.
  1425.  
  1426. #>    TERMINATE THE NUMBER CONVERSION, LEAVING A
  1427.     BYTE COUNT ON TOP OF STACK, A BYTE POINTER AT
  1428.     TOP - 1.
  1429.  
  1430. HIGHER LEVEL WORDS ARE USED TO PROVIDE NUMBER OUTPUT
  1431. IN A DEFAULT FORMAT:
  1432.  
  1433. U<#>    CONVERT THE UNSIGNED NUMBER ON THE TOP OF THE STACK
  1434.     AND LEAVE BYTE COUNT AND BYTE POINTER ON THE STACK.
  1435.     "U<#>" IS DEFINED  AS:
  1436.  
  1437.     'U<#> : <# #S #> ;
  1438.  
  1439. <#>    CONVERT THE SIGNED NUMBER ON THE TOP OF THE STACK
  1440.     AND LEAVE BYTE COUNT AND BYTE POINTER ON THE STACK.
  1441.     "<#>" IS DEFINED AS:
  1442.  
  1443.     '<#> : DUP <L <# #S  L> LTZ IF 55 #PUT THEN #> ;
  1444.  
  1445. U=    CONVERT AND OUTPUT THE NUMBER ON THE TOP OF THE
  1446.     STACK. (UNSIGNED)
  1447.  
  1448. =    CONVERT AND OUTPUT THE NUMBER ON THE TOP OF THE
  1449.     STACK. (SIGNED)
  1450.  
  1451. U?    CONVERT AND OUTPUT THE NUMBER ADDRESSED BY THE
  1452.     TOP OF THE STACK.  (UNSIGNED)
  1453.  
  1454. ?    CONVERT AND OUTPUT THE NUMBER ADDRESSED BY THE
  1455.     TOP OF THE STACK.  (SIGNED)
  1456.  
  1457.  
  1458. EXAMPLE:
  1459.  
  1460.     '$= : <# # # 56 #PUT #S 44 #PUT #> TYPE ;
  1461.     (RADIX IS ASSUMED TO BE OCTAL)
  1462.  
  1463.     0> 100 $=
  1464.     $1.00
  1465.     0> 1000 $=
  1466.     $10.00
  1467.  
  1468.     "$=" TYPES THE TOP OF THE STACK IN AN UNSIGNED
  1469.     DOLLAR AND CENTS FORMAT.  NUMBER CONVERSION IS
  1470.     INITIATED BY "<#", THE CENTS ARE OUTPUT BY THE
  1471.     TWO "#"'S, A PERIOD IS OUTPUT BY "56 #PUT", THE
  1472.     REMAINING DOLLARS ARE OUTPUT BY "#S", AND THE
  1473.     DOLLAR SIGN IS OUTPUT BY "44 #PUT".  "<# TERMINATES
  1474.     THE CONVERSION PROCESS AND LEAVES A BYTE POINTER
  1475.     AND BYTE COUNT FOR THE RESULTANT STRING ON THE STACK
  1476.     AS INPUT TO "TYPE" WHICH OUTPUTS THE STRING.
  1477.  
  1478.     JUSTIFICATION OF NUMERIC OUTPUT MAY BE ACHIEVED
  1479.     AS FOLLOWS:
  1480.  
  1481.     '4= : <#> 4 OVER - SPACES TYPE ;
  1482.  
  1483.     THE WORD "4=" WILL TYPE OUT NUMBERS RIGHT
  1484.     JUSTIFIED IN A FOUR COLUMN FIELD BY TYPING
  1485.     A VARIABLE NUMBER OF SPACES PRECEDING THE
  1486.     NUMBER.
  1487.  
  1488.  
  1489. TYI AND TYO
  1490.  
  1491.     "TYI" AND "TYO" PROVIDE A GENERALIZED CHARACTER
  1492. ORIENTED INPUT AND OUTPUT FACILITY.  "TYI" INPUTS A
  1493. CHARACTER BY EXECUTING THE WORD WHOSE ADDRESS IS
  1494. CONTAINED IN THE VARIABLE "IN".  "TYO", SIMILARLY
  1495. EXECUTES THE CONTENTS OF "OUT".  "IN" AND "OUT" ARE
  1496. INITIALIZED TO POINT TO "<TTI>", AND "<TTO>", WHICH ARE
  1497. TELETYPE INPUT AND OUTPUT WORDS.  ANY WORD WHICH USES
  1498. "TYO" FOR OUTPUT MAY BE MODIFIED TO OUTPUT ON ANOTHER
  1499. DEVICE OR PERHAPS INTO A CORE BUFFER BY CHANGING "OUT".
  1500. SIMILARLY, CHANGING "IN" WILL MODIFY THE INPUT OF ANY
  1501. WORD USING "TYI".  "TYPE", "MSG" AND ALL THE NUMBER
  1502. CONVERSION ROUTINES USE "TYO" TO PERFORM OUTPUT.
  1503.  
  1504.  
  1505. RECURSION
  1506.  
  1507.     SINCE STOIC IS A STACK ORIENTED LANGUAGE,
  1508. RECURSION IS HANDLED QUITE EASILY.  THE WORD "EXEC"
  1509. TAKES AS AN ARGUMENT ON THE STACK THE ADDRESS OF A WORD
  1510. TO BE EXECUTED AND CALLS IT.  BY PLACING THE ADDRESS OF
  1511. THE CALLING ROUTINE ITSELF ON THE STACK, A RECURSIVE
  1512. CALL IS GENERATED.
  1513.  
  1514. EXAMPLE:
  1515.  
  1516. 0 'SELF VARIABLE
  1517. 'FACTORIAL :  DUP 1 NE IF DUP 1- SELF @ EXEC * THEN ;
  1518. () FACTORIAL SELF !
  1519.  
  1520. THIS DEFINES A RECURSIVE FACTORIAL ROUTINE.
  1521.  
  1522.  
  1523. VOCABULARIES
  1524.  
  1525.     IN ADDITION TO THE PARAMETER STACK, STOIC USES
  1526. ANOTHER STACK CALLED THE VOCABULARY STACK.  THIS STACK
  1527. IS USED TO CONTROL DICTIONARY LOOKUP OPERATIONS.
  1528.  
  1529.     WHEN STOIC LOOKS UP A WORD IN THE DICTIONARY, IT
  1530. STARTS ITS SEARCH AT A LOCATION WHOSE ADDRESS IN STORED
  1531. ON THE TOP OF THE VOCABULARY STACK.  IF THE SEARCH
  1532. FAILS, IT SEARCHES AGAIN USING THE NEXT TO TOP OF THE
  1533. VOCABULARY STACK, ETC. UNTIL THE BOTTOM OF THE
  1534. VOCABULARY STACK IS REACHED.  IF THE NAME IS STILL
  1535. NOT FOUND, THE SEARCH FAILS.
  1536.  
  1537.     THE DICTIONARY MAY HAVE ANY NUMBER OF BRANCHES.
  1538. DIFFERENT WORDS HAVING EXACTLY THE SAME NAMES MAY BE
  1539. RESOLVED IF THEY ARE ON SEPARATE BRANCHES OF THE
  1540. DICTIONARY.  A BRANCH OF THE DICTIONARY IS CALLED A
  1541. VOCABULARY.
  1542.  
  1543.     WHEN STOIC DEFINES A NEW WORD, THE DICTIONARY
  1544. ENTRY IS APPENDED TO THE BRANCH POINTED TO BY THE
  1545. VARIABLE "CURRENT".
  1546.  
  1547.     THE KERNEL HAS TWO VOCABULARIES, CALLED "STOIC<",
  1548. AND "ASSEMBLER<".  INITIALLY, THE VOCABULARY STACK
  1549. CONTAINS ONLY THE ADDRESS OF "STOIC<".  "ASSEMBLER<" IS
  1550. USED WHEN MAKING CODE DEFINITIONS AND CONTAINS SPECIAL
  1551. WORDS USED ONLY BY THE STOIC ASSEMBLER.  "STOIC<" IS THE
  1552. MAIN BRANCH OF THE DICTIONARY, AND "ASSEMBLER<" IS A
  1553. SIDE-BRANCH.
  1554.  
  1555.     A NEW BRANCH OF THE DICTIONARY IS CREATED AS
  1556.     FOLLOWS:
  1557.  
  1558.     'NAME BRANCH
  1559.  
  1560.     REFERENCING A VOCABULARY CAUSES ITS ADDRESS TO
  1561.     BE PUSHED ON THE VOCABULARY STACK.  THE NEW
  1562.     BRANCH IS ATTACHED AT THE END OF THE EXISTING
  1563.     BRANCH POINTED TO BY "CURRENT".
  1564.  
  1565.     >    DISCARDS THE TOP OF THE VOCABULARY STACK
  1566.  
  1567.     ATTEMPTING TO POP THE LAST ENTRY OFF THE BOTTOM
  1568.     OF THE VOCABULARY STACK CAUSES THE ERROR:
  1569.  
  1570.     "VOCABULARY STACK EMPTY".
  1571.  
  1572.     TO SET "CURRENT" TO  POINT TO A NEW VOCABULARY,
  1573.     THE FOLLOWING WORD IS USED:
  1574.  
  1575.     DEFINITIONS    SETS "CURRENT" TO LINK NEW DEFINITIONS
  1576.             ONTO THE SAME BRANCH OF THE DICTIONARY
  1577.             AS IS POINTED TO BY THE TOP OF THE
  1578.             VOCABULARY STACK.
  1579.  
  1580.  
  1581. THE NORMAL PROCEDURE WHEN SETTING UP A NEW
  1582. VOCABULARY IS AS FOLLOWS:
  1583.  
  1584.     1) DEFINE THE VOCABULARY USING "BRANCH"
  1585.  
  1586.     2) PUSH THE ADDRESS OF THE VOCABULARY ON THE
  1587.        VOCABULARY STACK BY REFERENCING THE VOCABULARY.
  1588.  
  1589.     3) SET "CURRENT" USING "DEFINITIONS".
  1590.  
  1591.     4) DEFINE ALL THE WORDS IN THE VOCABULARY.
  1592.  
  1593.     5) POP THE VOCABULARY STACK USING ">".
  1594.  
  1595.     6) RESET "CURRENT"
  1596.  
  1597. EXAMPLE:
  1598.  
  1599.     'VOCAB< BRANCH
  1600.     VOCAB< DEFINITIONS
  1601.     .
  1602.     .
  1603.     .
  1604.     > DEFINITIONS
  1605.  
  1606.     THIS DEFINES A NEW BRANCH OF THE DICTIONARY
  1607.     CALLED "VOCAB".
  1608.  
  1609. ENTIRE SECTIONS OF THE DICTIONARY MAY BE DELETED
  1610. BY USING THE FOLLOWING WORD:
  1611.  
  1612.     'NAME FORGET DISCARDS THE NAMED DICTIONARY
  1613.              ENTRY AND ALL SUBSEQUENT
  1614.              ENTRIES.
  1615.  
  1616.     FORGET IS USEFUL WHEN TRYING OUT DEFINITIONS
  1617.     FROM THE KEYBOARD.  THE USUAL PROCEDURE IS TO
  1618.     FIRST MAKE A DUMMY DEFINITION:
  1619.  
  1620.     'TEST : ;
  1621.  
  1622.     NEXT, TEST DEFINITIONS ARE MADE (TYPICALLY BY
  1623.     LOADING A PROGRAM).  IF THEY ARE UNSUCCESSFUL,
  1624.     "'TEST FORGET" WILL DELETE THEM FROM THE
  1625.     DICTIONARY, AND THE PROCESS IS REPEATED.
  1626.     FOR CONVENIENCE, THE DUMMY DEFINITION MAY BE
  1627.     PLACED AT THE BEGINNING OF THE PROGRAM.
  1628.  
  1629.     "FORGET" MAY ALSO BE USED TO PROVIDE AN OVERLAY
  1630.     FACILITY.  SAY THAT A PROGRAM HAS BEEN LOADED.
  1631.     IT MAY THEN BE DELETED BY FORGETTING THE
  1632.     FIRST DEFINITION OF THE PROGRAM AND THE DICTIONARY
  1633.     SPACE IS THEN FREE TO LOAD ANOTHER PROGRAM.
  1634.  
  1635.  
  1636. DEBUGGING TECHNIQUES
  1637.  
  1638.     THE FOLLOWING ARE TECHNIQUES WHICH MAY PROVE
  1639. USEFUL IN DEBUGGING NEW DEFINITIONS:
  1640.  
  1641. 1) IT IS USUALLY MORE EFFICIENT TO MAKE A NEW
  1642.    DEFINITION IN A FILE USING THE EDITOR RATHER THAN
  1643.    FROM THE KEYBOARD IF IT IS MORE THAN ONE LINE LONG.
  1644.    "FORGET" IS THEN USED TO REMOVE THE LAST VERSION OF
  1645.    THE DEFINITION BEFORE TRYING AGAIN.
  1646.  
  1647. 2) TO TEST A WORD, MERELY FEED IN ARGUMENTS ON THE
  1648.    STACK, EXECUTE THE WORD, AND EXAMINE THE RESULTS
  1649.    USING "=" AND "?".
  1650.  
  1651. 3) IF A WORD FAILS, TYPE IN THE WORDS WHICH MAKE IT UP,
  1652.    ONE AT A TIME, EXAMINING THE STACK AS YOU GO ALONG AND
  1653.    RESTORING IT BY TYPING THE PARAMETERS BACK IN, IN
  1654.    REVERSE ORDER.
  1655.  
  1656. 4) AFTER EXECUTING A WORD AND EXAMINING THE RESULTS ON
  1657.    THE STACK, TYPE AN EXTRA "=" TO MAKE SURE THE STACK
  1658.    IS EMPTY.  YOU SHOULD GET THE MESSAGE "STACK EMPTY".
  1659.    SIMILARLY, THE LOOP STACK SHOULD BE CHECKED BY TYPING
  1660.    "L>"; THIS SHOULD GENERATE THE MESSAGE "LOOP STACK
  1661.    EMPTY".
  1662.  
  1663. 5) KEEP TRACK OF THE RADIX YOU ARE USING.  THIS IS THE
  1664.    SOURCE OF FREQUENT ERRORS.  WITHIN A FILE BEING
  1665.    EXECUTED, SAVE THE RADIX, SET IT TO THE VALUE THE
  1666.    PROGRAM EXPECTS, AND WHEN DONE, RESTORE THE SAVED
  1667.    VALUE.  FOR EXAMPLE:
  1668.  
  1669.     RADIX @ DECIMAL
  1670.     .
  1671.     .
  1672.     .
  1673.     RADIX !
  1674.     ;F
  1675.  
  1676.     THIS SAVES THE CURRENT RADIX ON THE STACK, AND
  1677.     SETS THE RADIX TO DECIMAL.  UPON TERMINATION,
  1678.     THE OLD RADIX IS RESTORED (ASSUMING THE STACK
  1679.     HAS NOT BEEN DISTURBED).
  1680.  
  1681. 6) THE PROPER SELECTION OF LOWER LEVEL WORDS HAS AN
  1682.    ENORMOUS EFFECT ON ALL SUBSEQUENT HIGHER LEVEL
  1683.    DEFINITIONS.  THUS IT PAYS TO DESIGN THE LOWER LEVEL
  1684.    WORDS VERY CAREFULLY.
  1685.  
  1686. 7) WHEN DEBUGGING A PROGRAM, TEST ALL LOWER LEVEL WORDS
  1687.    THOROUGHLY BEFORE TESTING THE WORDS WHICH CALL THEM.
  1688.  
  1689. 8) BE ESPECIALLY CAREFUL WITH ANY WORD WHICH MODIFIES
  1690.    MEMORY; MAKE SURE THE WORD IS MODIFYING ONLY THOSE
  1691.    LOCATIONS YOU INTEND, AND NOT PART OF THE PROGRAM.
  1692.  
  1693.  
  1694.  
  1695. ***EOF***
  1696.