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 / KERNEL.DOC < prev    next >
Text File  |  1984-04-29  |  24KB  |  962 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6. ***************************************************************************
  7. ** COPYRIGHT (C) MASSACHUSETTS INSTITUTE OF TECHNOLOGY AND HARVARD       **
  8. ** UNIVERSITY, BIOMEDICAL ENGINEERING CENTER 1977.  ALL RIGHTS RESERVED. **
  9. ***************************************************************************
  10.  
  11. THE STOIC KERNEL
  12. J. SACHS
  13. 3/3/77
  14.  
  15.     THE KERNEL IS A COLLECTION OF WORDS WHICH DEFINE
  16. STOIC ITSELF AND WHICH MAKE FURTHER DEFINITIONS POSSIBLE.
  17. THE FOLLOWING IS A COMPLETE LIST OF THE WORDS IN THE
  18. KERNEL ALONG WITH DESCRIPTIONS OF THEIR ACTION.  ANY OF
  19. THESE WORDS MAY BE CALLED BY THE USER ALTHOUGH SOME
  20. OF THEM ARE HIGHLY SPECIALIZED.
  21.  
  22. VARIABLES
  23.  
  24. NAME    DESCRIPTION
  25.  
  26. STATE    ZERO FOR EXECUTE (BYTE VARIABLE)
  27.     NONZERO FOR COMPILE
  28.  
  29. CURRENT    DICTIONARY HEAD FOR NEW DEFINITIONS
  30.  
  31. .C    COMPILE BUFFER POINTER
  32.  
  33. .D    CURRENT POINTER TO END OF DICTIONARY
  34.  
  35. .I    PSEUDO-INSTRUCTION POINTER
  36.  
  37. .R    RETURN STACK POINTER
  38.  
  39. .L    LOOP STACK POINTER
  40.  
  41. .V    VOCABULARY STACK POINTER
  42.  
  43. RADIX    CURRENT NUMBER CONVERSION RADIX
  44.  
  45. CHECK    NESTING DEPTH COUNTER (BYTE VARIABLE)
  46.  
  47. IN    CURRENT INPUT ROUTINE
  48.  
  49. OUT    CURRENT OUTPUT ROUTINE
  50.  
  51. PROMPT    ADDRESS OF PROMPT WORD
  52.  
  53. ERRMSG    ADDRESS OF ERROR MESSAGE HANDLER
  54.  
  55. COLUMN    OUTPUT COLUMN # (BYTE VARIABLE)
  56.  
  57. FCT    FILE CONTROL TABLE POINTER
  58.  
  59. MEMORY    TOP OF RAM
  60.  
  61. LIT    ADDRESS OF LITERAL HANDLER
  62.  
  63. (TTYIN)    ADDRESS OF TTY INPUT ROUTINE
  64.  
  65. (TTYOU)    ADDRESS OF TTY OUTPUT ROUTINE
  66.  
  67. (ABORT)    ADDRESS OF ROUTINE CALLED EVERY TIME "ABORT" IS INVOKED
  68.  
  69.  
  70. THE KERNEL CONTAINS THE FOLLOWING CONSTANTS:
  71.  
  72. NAME    VALUE
  73.  
  74. -1    -1
  75.  
  76. 0    0
  77.  
  78. 1    1
  79.  
  80. 2    2
  81.  
  82.  
  83.     NEXT FOLLOWS A LIST OF THE BASIC STOIC
  84. VOCABULARY.  THE COLUMN LABELLED "ARGS" GIVES THE
  85. NUMBER OF ARGUMENTS EXPECTED ON THE STACK FOLLOWED
  86. BY THE NUMBER OF RESULTS RETURNED ON THE STACK.  AN
  87. ASTERISK IN THIS COLUMN INDICATES THAT THE PRECEDENCE
  88. BIT FOR THE CORRESPONDING DICTIONARY ENTRY IS SET.
  89.  
  90.  
  91. LITERAL HANDLING WORDS
  92. NAME    ARGS    DESCRIPTION
  93.  
  94. ()    0/1    PUSH THE CONTENTS OF THE LOCATION
  95.         POINTED TO BY ".I".  INCREMENT ".I"
  96.  
  97. S()    0/1    PUSH THE ADDRESS OF THE STRING LITERAL
  98.         IMMEDIATELY FOLLOWING.  IT GETS THE NEXT
  99.         WORD, EXTRACTS THE LENGTH, AND INCREMENTS
  100.         ".I" TO POINT TO THE FIRST WORD FOLLOWING
  101.         THE STRING.  THE ADDRESS OF THE FIRST WORD
  102.         OF THE STRING IS LEFT ON THE STACK.
  103.  
  104.  
  105. ERROR HANDLING WORDS
  106. NAME    ARGS    DESCRIPTION
  107.  
  108. ABORT    N/0    THIS IS A GENERAL GARBAGE COLLECTION ROUTINE
  109.         WHICH ABORTS WHATEVER ACTION IS
  110.         CURRENTLY BEING TAKEN AND RETURNS
  111.         CONTROL TO THE KEYBOARD.
  112.  
  113. ERR    1/0    EXECUTES THE CONTENTS OF THE WORD "ERRMSG".
  114.  
  115. ERRCH    0/0    CHECKS FOR THE ERROR CONDITIONS:
  116.  
  117.         LOOP STACK EMPTY/FULL
  118.         VOCABULARY STACK EMPTY/FULL
  119.         DICTIONARY FULL
  120.         COMPILE BUFFER FULL
  121.  
  122.         IF AN ERROR CONDITION EXISTS, EXECUTE
  123.         "ERR" WITH THE APPROPRIATE MESSAGE.
  124.         OTHERWISE RETURN.
  125.  
  126.  
  127. STACK MANIPULATION WORDS
  128. NAME    ARGS    DESCRIPTION
  129.  
  130. S@    0/1    PUSH THE CONTENTS OF THE STACK POINTER
  131.  
  132. <R    1/0    PUSH TOP ON RETURN STACK
  133.  
  134. R>    0/1    POP TOP FROM RETURN STACK
  135.  
  136. <L    1/0    PUSH TOP ON LOOP STACK
  137.  
  138. L>    0/1    POP TOP FROM LOOP STACK
  139.  
  140.  
  141. NAME    ARGS    BEFORE    AFTER
  142.  
  143. DUP    1/2    A    A
  144.             A
  145.  
  146. OVER    2/3    A    B
  147.         B    A
  148.             B
  149.  
  150. 2OVER    3/4    A    C
  151.         B    A
  152.         C    B
  153.             C
  154.  
  155. 3OVER    4/5    A    D
  156.         B    A
  157.         C    B
  158.         D    C
  159.             D
  160.  
  161. UNDER    2/1    A    A
  162.         B
  163.  
  164. 2UNDER    3/2    A    B
  165.         B    A
  166.         C
  167.  
  168. 3UNDER    4/3    A    B
  169.         B    C
  170.         C    A
  171.         D
  172.  
  173. SWAP    2/2    A    B
  174.         B    A
  175.  
  176. 2SWAP    3/3    A    A
  177.         B    C
  178.         C    B
  179.  
  180. FLIP    3/3    A    C
  181.         B    B
  182.         C    A
  183.  
  184. DROP    1/0    A    B
  185.         B
  186.  
  187. 2DROP    2/0    A    C
  188.         B
  189.         C
  190.  
  191. 3DROP    3/0    A    D
  192.         B
  193.         C
  194.         D
  195.  
  196. DDUP    2/4    A    A
  197.         B    B
  198.             A
  199.             B
  200.  
  201. DOVER    4/6    A    C
  202.         B    D
  203.         C    A
  204.         D    B
  205.             C
  206.             D
  207.  
  208. DUNDER    4/2    A    A
  209.         B    B
  210.         C
  211.         D
  212.  
  213. DSWAP    4/4    A    C
  214.         B    D
  215.         C    A
  216.         D    B
  217.  
  218. -ROT    3/3    A    C
  219.         B    A
  220.         C    B
  221.  
  222. +ROT    3/3    A    B
  223.         B    C
  224.         C    A
  225.  
  226.  
  227. LOAD AND STORE WORDS
  228. NAME    ARGS    DESCRIPTION
  229.  
  230. @    1/1    REPLACES ADDRESS AT TOP WITH ITS
  231.         CONTENTS
  232.  
  233. !    2/0    STORES NUMBER AT TOP - 1 IN ADDRESS AT
  234.         TOP.
  235.  
  236. <-    2/0    STORE WORD ON TOP IN LOCATION
  237.         ADDRESSED BY TOP - 1
  238.  
  239. @@    1/1    LOAD INDIRECT TOP
  240.  
  241. @!    2/0    STORE TOP - 1 INDIRECT ADDRESS AT TOP
  242.  
  243. +!    2/0    ADD TOP - 1 TO CONTENTS OF LOCATION
  244.         ADDRESSED BY TOP
  245.  
  246. 1+!    1/0    INCREMENT LOCATION ADDRESSED BY TOP
  247.  
  248. 1-!    1/0    DECREMENT LOCATION ADDRESSED BY TOP
  249.  
  250. 0<-    1/0    ZERO LOCATION ADDRESSED BY TOP
  251.  
  252. -1<-    1/0    SET TO -1 LOCATION ADDRESSED BY TOP
  253.  
  254. MOVE    2/0    THE CONTENTS OF THE LOCATION ADDRESSED
  255.         BY TOP - 1 IS STORED A THE LOCATION
  256.         GIVEN BY TOP.
  257.  
  258. XCHG    2/0    THE CONTENTS OF TWO WORDS ADDRESSED BY
  259.         TOP AND TOP - 1 ARE INTERCHANGED.
  260.  
  261. B@    1/1    LOAD BYTE ADDRESSED BY BYTE POINTER ON
  262.         TOP OF STACK
  263.  
  264. B!    2/0    STORE BYTE AT TOP - 1 AT BYTE ADDRESS
  265.         ON TOP OF STACK
  266.  
  267. FILL    3/0    STORE N COPIES OF DATA AT TOP AT ADDRESS
  268.         AT TOP-2 WHERE N IS AT TOP-1.
  269.  
  270. 0FILL    2/0    STORE N ZEROS AT ADDRESS AT TOP-1 WHERE N
  271.         IS AT TOP.
  272.         
  273. MVBYTES    3/0    COPY N BYTES FROM LOCATION A TO LOCATION
  274.         B.  N IS TOP OF STACK, B IS TOP - 1, AND
  275.         A IS TOP - 2.  (A AND B ARE BYTE POINTERS)
  276.         A AND B RUN FORWARDS.
  277.  
  278. RMVBYTES 3/0    COPY N BYTES FROM LOCATION A TO LOCATION
  279.         B.  N IS TOP OF STACK, B IS TOP - 1, AND
  280.         A IS TOP - 2.  (A AND B ARE BYTE POINTERS)
  281.         A AND B RUN BACKWARDS.
  282.  
  283.  
  284. UNARY OPERATORS
  285. NAME    ARGS    DESCRIPTION
  286.  
  287. MINUS    1/1    NEGATES TOP
  288.  
  289. NOT    1/1    COMPLEMENTS TOP
  290.  
  291. 2*    1/1    SHIFT TOP LEFT 1
  292.  
  293. 2/    1/1    SHIFT TOP RIGHT 1 (SIGNED)
  294.  
  295. U2/    1/1    SHIFT TOP RIGHT 1 (UNSIGNED)
  296.  
  297. EXEC    1/0    EXECUTE WORD WHOSE ADDRESS IS AT TOP
  298.  
  299. 1+    1/1    INCREMENT TOP
  300.  
  301. 1-    1/1    DECREMENT TOP
  302.  
  303. 2+    1/1    INCREMENT TOP BY 2
  304.  
  305. 2-    1/1    DECREMENT TOP BY 2
  306.  
  307. ABS    1/1    TAKE ABSOLUTE VALUE OF TOP
  308.  
  309. EQZ    1/1    IF TOP EQUALS 0, PUSH -1
  310.         OTHERWISE PUSH 0
  311.  
  312. LTZ    1/1    IF TOP LESS THAN 0, PUSH -1
  313.         OTHERWISE PUSH 0
  314.  
  315. GTZ    1/1    IF TOP GREATER THAN 0, PUSH -1
  316.         OTHERWISE PUSH 0
  317.  
  318. NEZ    1/1    IF TOP NOT EQUAL TO 0, PUSH -1
  319.         OTHERWISE PUSH 0
  320.  
  321. LEZ    1/1    IF TOP LESS OR EQUAL TO 0, PUSH -1
  322.         OTHERWISE PUSH 0
  323.  
  324. GEZ    1/1    IF TOP GREATER OR EQUAL TO 0, PUSH -1
  325.         OTHERWISE PUSH 0
  326.  
  327.  
  328. BINARY OPERATORS
  329. NAME    ARGS    DESCRIPTION
  330.  
  331. +    2/1    ADDS TOP AND TOP - 1
  332.  
  333. -    2/1    SUBTRACTS TOP FROM TOP - 1
  334.  
  335. AND    2/1    ANDS TOP AND TOP - 1
  336.  
  337. OR    2/1    ORS TOP AND TOP - 1
  338.  
  339. XOR    2/1    XORS TOP AND TOP - 1
  340.  
  341. MAX    2/1    MAXIMUM OF TOP AND TOP - 1 (SIGNED)
  342.  
  343. MIN    2/1    MINIMUM OF TOP AND TOP - 1 (SIGNED)
  344.  
  345. UMAX    2/1    MAXIMUM OF TOP AND TOP - 1 (UNSIGNED)
  346.  
  347. UMIN    2/1    MINIMUM OF TOP AND TOP - 1 (UNSIGNED)
  348.  
  349. LSHIFT    2/1    SHIFT WORD AT TOP - 1 LEFT A NUMBER
  350.         OF BIT POSITIONS ON TOP OF STACK
  351.  
  352. RSHIFT    2/1    SHIFT WORD AT TOP - 1 RIGHT A NUMBER
  353.         OF BIT POSITIONS ON TOP OF STACK
  354.         (SIGNED)
  355.  
  356. URSHIFT    2/1    SHIFT WORD AT TOP - 1 RIGHT A NUMBER
  357.         OF BIT POSITIONS ON TOP OF STACK
  358.         (UNSIGNED)
  359.  
  360. DLSHIFT    3/2    32-BIT LEFT SHIFT THE NUMBER AT TOP - 1
  361.         AND TOP - 2 A NUMBER OF PLACES GIVEN BY
  362.         TOP.
  363.  
  364. DRSHIFT    3/2    32-BIT RIGHT SHIFT THE NUMBER AT TOP - 1
  365.         AND TOP - 2 A NUMBER OF PLACES GIVEN BY
  366.         TOP.  (SIGNED)
  367.  
  368. DURSHIFT 3/2    32-BIT RIGHT SHIFT THE NUMBER AT TOP - 1
  369.         AND TOP - 2 A NUMBER OF PLACES GIVEN BY
  370.         TOP.  (UNSIGNED)
  371.  
  372. EQ    2/1    IF TOP EQUALS TOP - 1, PUSH -1
  373.         OTHERWISE PUSH 0
  374.  
  375. NE    2/1    IF TOP NOT EQUAL TO TOP - 1, PUSH -1
  376.         OTHERWISE PUSH 0
  377.  
  378. LT    2/1    IF TOP LESS THAN TOP - 1, PUSH -1
  379.         OTHERWISE PUSH 0 (SIGNED)
  380.  
  381. GT    2/1    IF TOP GREATER THAN TOP - 1, PUSH -1
  382.         OTHERWISE PUSH 0 (SIGNED)
  383.  
  384. LE    2/1    IF TOP LESS OR EQUAL THAN TOP - 1,
  385.         PUSH -1, OTHERWISE PUSH 0 (SIGNED)
  386.  
  387. GE    2/1    IF TOP GREATER OR EQUAL THAN TOP - 1,
  388.         PUSH -1, OTHERWISE PUSH 0 (SIGNED)
  389.  
  390. ULT    2/1    IF TOP LESS THAN TOP - 1, PUSH -1
  391.         OTHERWISE PUSH 0 (UNSIGNED)
  392.  
  393. UGT    2/1    IF TOP GREATER THAN TOP - 1, PUSH -1
  394.         OTHERWISE PUSH 0 (UNSIGNED)
  395.  
  396. ULE    2/1    IF TOP LESS OR EQUAL THAN TOP - 1,
  397.         PUSH -1, OTHERWISE PUSH 0 (UNSIGNED)
  398.  
  399. UGE    2/1    IF TOP GREATER OR EQUAL THAN TOP - 1,
  400.         PUSH -1, OTHERWISE PUSH 0 (UNSIGNED)
  401.  
  402.  
  403. MIXED PRECISION OPERATORS
  404.  
  405. M+    3/2    ADD THE SINGLE PRECISION NUMBER AT TOP
  406.         TO THE DOUBLE PRECISION NUMBER
  407.         (TOP-1,TOP-2) GIVING A DOUBLE PRECISION
  408.         RESULT.
  409.  
  410. M-    3/2    SUBTRACT THE SINGLE PRECISION NUMBER AT
  411.         TOP FROM THE DOUBLE PRECISION NUMBER
  412.         (TOP-1,TOP-2) GIVING A DOUBLE PRECISION
  413.         RESULT.
  414.  
  415.  
  416. MULTIPLY AND DIVIDE WORDS
  417. OVERFLOW DOES NOT GENERATE ERROR MESSAGE
  418.  
  419. UNSIGNED OPERATIONS
  420. NAME    ARGS    DESCRIPTION
  421.  
  422. UM*    2/2    UNSIGNED MULTIPLY WITH 32-BIT RESULT
  423.  
  424. U/MOD    2/2    UNSIGNED INTEGER DIVIDE, (TOP-1)/TOP
  425.         REMAINDER ON TOP, QUOTIENT AT TOP - 1
  426.  
  427. UM/MOD    3/2    UNSIGNED DIVIDE, (TOP-1,TOP-2)/TOP
  428.         REMAINDER ON TOP, QUOTIENT AT TOP - 1
  429.  
  430. U*    2/1    UNSIGNED MULTIPLY
  431.  
  432. U/    2/1    UNSIGNED INTEGER DIVIDE
  433.  
  434. UMOD    2/1    UNSIGNED REMAINDER
  435.  
  436. UM/    3/1    UNSIGNED DIVIDE
  437.  
  438. U*/MOD    3/2    UNSIGNED (TOP-2)*(TOP-1)/TOP (32 BIT
  439.         INTERMEDIATE PRODUCT) REMAINDER AT TOP,
  440.         QUOTIENT AT TOP - 1
  441.  
  442. U*/    3/1    UNSIGNED (TOP-2)*(TOP-1)/TOP (32 BIT
  443.         INTERMEDIATE PRODUCT)
  444.  
  445. SIGNED OPERATIONS
  446. NAME    ARGS    DESCRIPTION
  447.  
  448. M*    2/2    SIGNED MULTIPLY TOP - 1 BY TOP
  449.         WITH 32-BIT RESULT
  450.  
  451. /MOD    2/2    SIGNED DIVIDE TOP - 1 BY TOP
  452.         LEAVING REMAINDER AT TOP,
  453.         QUOTIENT AT TOP - 1.
  454.  
  455. M/MOD    3/2    SIGNED DIVIDE, (TOP-1,TOP-2)/TOP
  456.         REMAINDER ON TOP, QUOTIENT AT TOP - 1
  457.  
  458. *    2/1    SIGNED MULTIPLY
  459.  
  460. /    2/1    SIGNED INTEGER DIVIDE
  461.  
  462. MOD    2/1    SIGNED REMAINDER
  463.  
  464. M/    3/1    SIGNED DIVIDE
  465.  
  466. */    3/1    SIGNED (TOP-2)*(TOP-1)/TOP (32 BIT
  467.         INTERMEDIATE PRODUCT)
  468.  
  469. */MOD    3/2    SIGNED (TOP-2)*(TOP-1)/TOP (32 BIT
  470.         INTERMEDIATE PRODUCT) REMAINDER AT TOP,
  471.         QUOTIENT AT TOP - 1
  472.  
  473.  
  474. DICTIONARY MANIPULATING WORDS
  475. NAME    ARGS    DESCRIPTION
  476.  
  477. .    0/1    PUSH VALUE OF DICTIONARY POINTER (".D")
  478.  
  479. C.    0/1    PUSH VALUE OF COMPILE BUFFER POINTER (".C")
  480.  
  481. ,    1/0    STORE TOP AT END OF DICTIONARY,
  482.         INCREMENT ".D".
  483.  
  484. C,    1/0    STORE TOP AT END OF COMPILE BUFFER,
  485.         INCREMENT ".C".
  486.  
  487. B,    1/0    STORES A BYTE AT END OF DICTIONARY
  488.  
  489. CB,    1/0    STORES A BYTE AT END OF COMPILE BUFFER
  490.  
  491. IMMEDIATE 0/0    SET PRECEDENCE BIT OF MOST RECENTLY
  492.         DEFINED WORD (FOUND VIA "CURRENT").
  493.  
  494. ENTER    1/0    STRING ARGUMENT ON STACK.  FIRST
  495.         VERIFIES THAT THE NAMED WORD IS UNDEFINED.
  496.         IF DEFINED TYPES WARNING "REDEFINING"
  497.         FOLLOWED BY STRING.  THE NAME IS COPIED
  498.         ONTO THE END OF THE DICTIONARY, THE NEW
  499.         ENTRY IS LINKED IN, AND A ($+2) IS
  500.         STORED AS THE CODE ADDRESS.
  501.  
  502. ASSEMBLER< 0/0    PUSH ADDRESS OF "ASSEMBLER<" ON VOCABULARY STACK.
  503.  
  504. STOIC<    0/0    PUSH ADDRESS OF "STOIC<" ON VOCABULARY STACK.
  505.  
  506. >    0/0    DISCARDS THE TOP OF THE VOCABULARY STACK
  507.  
  508. DEFINITIONS 1/0    COPIES THE TOP OF THE VOCABULARY STACK INTO "CURRENT".
  509.  
  510. BRANCH    1/0    CREATE NEW VOCABULARY DISJOINT FROM
  511.         DICTIONARY.  GET VOCABULARY NAME FROM
  512.         STRING ARGUMENT.
  513.  
  514. FORGET    1/0    LOOK UP STRING ARGUMENT IN DICTIONARY
  515.         AND DISCARD IT AND ALL MORE RECENT
  516.         DICTIONARY ENTRIES.
  517.  
  518. //    0/0*    COMPLEMENT "STATE"
  519.  
  520. (:)    0/0    ANONYMOUS DICTIONARY ENTRY WHICH
  521.         PUSHES ".I" ON THE RETURN STACK AND
  522.         SETS ".I" TO 2 LESS THAN THE ADDRESS
  523.         OF THE FIRST WORD OF THE PARAMETER
  524.         FIELD OF THE CURRENTLY EXECUTING WORD.
  525.  
  526. ((:))    0,0    ANONYMOUS DICTIONARY ENTRY WHICH
  527.         GETS NEXT WORD VIA ".I" AND COPIES
  528.         THAT MANY BYTES FROM THE PSEUDO-
  529.         INSTRUCTION STREAM INTO THE DICTIONARY.
  530.         BOTH ".I" AND ".D" ARE UPDATED.
  531.  
  532. :    0/0*    GIVES "SYNTAX ERROR" IF CHECK IS NOT
  533.         ZERO, INCREMENTS CHECK, OUTPUT ADDRESS
  534.         OF ENTER TO COMPILE BUFFER, OUTPUT
  535.         ADDRESS OF ((:)) TO COMPILE BUFFER,
  536.         PUSH THE CONTENTS OF .C, OUTPUT A ZERO
  537.         TO THE COMPILE BUFFER.
  538.  
  539. CODE<    0/0*    OUTPUT ADDRESS OF "ENTER" TO COMPILE
  540.         BUFFER, PUSH THE ADDRESS OF "ASSEMBLER<"
  541.         ON THE VOCABULARY STACK.
  542.  
  543. (;)    0/0    ANONYMOUS DICTIONARY ENTRY WHICH POPS
  544.         ".I" OFF THE RETURN STACK.
  545.  
  546. ;    0/0*    DECREMENT CHECK, GIVE "SYNTAX ERROR" IF
  547.         NOT ZERO, TERMINATE ":", OUTPUT ADDRESS
  548.         OF (;) TO COMPILE BUFFER.
  549.  
  550. (;CODE<) 0/0    ANONYMOUS DICTIONARY ENTRY WHICH
  551.         STORES (CONTENTS OF ".I")+1 IN THE CODE
  552.         ADDRESS WORD OF THE MOST RECENTLY
  553.         DEFINED WORD.
  554.  
  555. ;CODE<    0/0*    DECREMENT CHECK, GIVE "SYNTAX ERROR" IF
  556.         NOT ZERO, TERMINATE ":", OUTPUT ADDRESS OF
  557.         (;CODE<) TO COMPILE BUFFER, PUSH ADDRESS OF
  558.         "ASSEMBLER<" ON VOCABULARY STACK.
  559.  
  560. (CONSTANT) 0/1    PUSH CONTENTS OF PARAMETER FIELD.
  561.  
  562. CONSTANT 2/0    EXECUTE "ENTER", OUTPUT TOP - 1
  563.         DICTIONARY, SET UP (CONSTANT) AS CODE
  564.         ADDRESS.
  565.  
  566. (VARIABLE) 0/1    PUSH ADDRESS OF PARAMETER FIELD.
  567.  
  568. VARIABLE 2/0    EXECUTE "CONSTANT", SET UP (VARIABLE)
  569.         AS CODE ADDRESS.
  570.  
  571. ARRAY    2/0    2ND ARGUMENT IS NAME OF ARRAY.  AN INITIALLY
  572.         ZERO VARIABLE IS CREATED AND N-1 ZEROS
  573.         ARE OUTPUT TO THE DICTIONARY WHERE N IS
  574.         THE 1ST ARGUMENT.
  575.  
  576. (;:)    0/1    PUSH ".I" ON RETURN STACK, SET ".I"
  577.         TO THE CONTENTS OF THE 2ND WORD OF THE
  578.         PARAMETER FIELD, DECREMENT ".I" BY 2.
  579.  
  580. ;:    0/0    EXECUTE "CONSTANT", POP RETURN STACK
  581.         AND OUTPUT TOP OF RETURN STACK TO
  582.         DICTIONARY, SET UP (;:) AS CODE ADDRESS.
  583.  
  584.  
  585. HIGHER LEVEL COMPILER WORDS
  586. NAME    ARGS    DESCRIPTION
  587.  
  588. +CHECK    0/0    INCREMENTS "CHECK"
  589.  
  590. -CHECK    0/0    DECREMENTS "CHECK"; IF RESULT IS MINUS,
  591.         THE ERROR "SYNTAX ERROR" IS GIVEN.
  592.  
  593. (IF)    1/0    TESTS TOP.  IF ZERO, ".I" IS INCREMENTED.
  594.         OTHERWISE, ".I" IS INCREMENTED BY THE CONTENTS
  595.         OF THE NEXT SEQUENTIAL WORD AND
  596.         INCREMENTS ".I".
  597.  
  598. (ELSE)    1/0    INCREMENTS ".I" BY THE CONTENTS OF THE NEXT
  599.         SEQUENTIAL WORD.
  600.  
  601. (()    1/0    DECREMENTS THE TOP OF THE STACK.  IF NEGATIVE
  602.         OR ZERO, ".I" IS INCREMENTED BY THE CONTENTS OF THE
  603.         NEXT SEQUENTIAL WORD.  OTHERWISE, THE
  604.         LOOP STACK POINTER IS INCREMENTED TWICE,
  605.         THE TOP OF THE STACK IS PUSHED ON THE LOOP
  606.         STACK, AND ".I" IS INCREMENTED.
  607.  
  608. (U()    1/0    DECREMENTS THE TOP OF THE STACK.  IF ZERO,
  609.         ".I" IS INCREMENTED BY THE CONTENTS OF THE
  610.         NEXT SEQUENTIAL WORD.  OTHERWISE, THE
  611.         LOOP STACK POINTER IS INCREMENTED TWICE,
  612.         THE TOP OF THE STACK IS PUSHED ON THE LOOP
  613.         STACK, AND ".I" IS INCREMENTED.
  614.  
  615. ())    0/0    DECREMENTS THE WORD ON THE TOP OF
  616.         THE LOOP STACK.  IF THE RESULT IS
  617.         ZERO, THE LOOP STACK IS POPPED 3 TIMES
  618.         AND ".I" IS INCREMENTED.  OTHERWISE, ".I"
  619.         IS INCREMENTED BY THE CONTENTS OF THE NEXT
  620.         SEQUENTIAL WORD.
  621.  
  622. (DO)    2/0    TESTS IF TOP IS GREATER OR EQUAL TOP-1
  623.         IF GREATER OR EQUAL, ".I" IS INCREMENTED
  624.         BY THE CONTENTS OF THE NEXT SEQUENTIAL WORD.
  625.         IF NOT, TOP-1 IS PUSHED ON THE LOOP
  626.         STACK FOLLOWED BY TWO COPIES OF TOP,
  627.         AND ".I" IS INCREMENTED.  (SIGNED)
  628.  
  629. (LOOP)    0/0    INCREMENTS THE TOP OF THE LOOP STACK
  630.         AND COMPARES THE RESULT WITH TOP-2
  631.         OF THE LOOP STACK.  IF GREATER OR EQUAL,
  632.         POP THE LOOP STACK 3 TIMES AND INCREMENT
  633.         ".I".  OTHERWISE ".I" IS INCREMENTED BY THE
  634.         CONTENTS OF THE NEXT SEQUENTIAL WORD.
  635.         (SIGNED)
  636.  
  637. (+LOOP)     1/0    ADDS THE TOP OF THE STACK TO THE TOP
  638.         OF THE LOOP STACK.  OTHERWISE THE SAME
  639.         AS "LOOP".  (SIGNED)
  640.  
  641. (UDO)    2/0    TESTS IF TOP IS GREATER OR EQUAL TOP-1
  642.         IF GREATER OR EQUAL, ".I" IS INCREMENTED
  643.         BY THE CONTENTS OF THE NEXT SEQUENTIAL WORD.
  644.         IF NOT, TOP-1 IS PUSHED ON THE LOOP
  645.         STACK FOLLOWED BY TWO COPIES OF TOP,
  646.         AND ".I" IS INCREMENTED.  (UNSIGNED)
  647.  
  648. (ULOOP)    0/0    INCREMENTS THE TOP OF THE LOOP STACK
  649.         AND COMPARES THE RESULT WITH TOP-2
  650.         OF THE LOOP STACK.  IF GREATER OR EQUAL,
  651.         POP THE LOOP STACK 3 TIMES AND INCREMENT
  652.         ".I".  OTHERWISE ".I" IS INCREMENTED BY THE
  653.         CONTENTS OF THE NEXT SEQUENTIAL WORD.
  654.         (UNSIGNED)
  655.  
  656. (U+LOOP) 1/0    ADDS THE TOP OF THE STACK TO THE TOP
  657.         OF THE LOOP STACK.  OTHERWISE THE SAME
  658.         AS "ULOOP".  (UNSIGNED)
  659.  
  660. BEGIN    0/1*    EXECUTE +CHECK, PUSH (CONTENTS OF .C) - 2
  661.  
  662. END    1/0*    EXECUTE -CHECK, OUTPUT ADDRESS OF (IF) TO
  663.         COMPILE BUFFER, TERMINATE "BEGIN".
  664.  
  665. REPEAT    2/0*    EXECUTE -CHECK TWICE, OUTPUT ADDRESS OF (ELSE)
  666.         TO COMPILE BUFFER, TERMINATE "BEGIN" AND "IF".
  667.  
  668. IF    0/1*    EXECUTE +CHECK, OUTPUT ADDRESS OF (IF) TO
  669.         COMPILE BUFFER, PUSH CONTENTS OF ".C", OUTPUT
  670.         A ZERO TO THE COMPILE BUFFER.
  671.  
  672. THEN    1/0*    EXECUTE -CHECK, TERMINATE "IF".
  673.  
  674. ELSE    1/1*    EXECUTE -CHECK, EXECUTE +CHECK, OUTPUT ADDRESS
  675.         OF (ELSE) TO COMPILE BUFFER,  TERMINATE "IF",
  676.         PUSH CONTENTS OF .C, OUTPUT A ZERO TO THE
  677.         COMPILE BUFFER.
  678.  
  679. (    0/1*    EXECUTE +CHECK, OUTPUT ADDRESS OF (() TO
  680.         THE COMPILE BUFFER.  PUSH CONTENTS OF ".C",
  681.         OUTPUT A ZERO TO THE COMPILE BUFFER.
  682.  
  683. U(    0/1*    EXECUTE +CHECK, OUTPUT ADDRESS OF (U() TO
  684.         THE COMPILE BUFFER.  PUSH CONTENTS OF ".C",
  685.         OUTPUT A ZERO TO THE COMPILE BUFFER.
  686.  
  687. )    1/0*    EXECUTE -CHECK, OUTPUT ADDRESS OF ()) TO
  688.         THE COMPILE BUFFER, TERMINATE "(".
  689.  
  690. DO    0/1*    EXECUTE +CHECK, OUTPUT ADDRESS OF (DO) TO
  691.         THE COMPILE BUFFER.  PUSH CONTENTS OF ".C",
  692.         OUTPUT A ZERO TO THE COMPILE BUFFER.
  693.  
  694. LOOP    1/0*    EXECUTE -CHECK, OUTPUT ADDRESS OF (LOOP) TO
  695.         THE COMPILE BUFFER, TERMINATE "DO".
  696.         
  697. +LOOP    1/0*    EXECUTE -CHECK, OUTPUT ADDRESS OF (+LOOP) TO
  698.         THE COMPILE BUFFER, TERMINATE "DO".
  699.         
  700. UDO    0/1*    EXECUTE +CHECK, OUTPUT ADDRESS OF (UDO) TO
  701.         THE COMPILE BUFFER.  PUSH CONTENTS OF ".C",
  702.         OUTPUT A ZERO TO THE COMPILE BUFFER.
  703.  
  704. ULOOP    1/0*    EXECUTE -CHECK, OUTPUT ADDRESS OF (ULOOP) TO
  705.         THE COMPILE BUFFER, TERMINATE "DO".
  706.         
  707. U+LOOP    1/0*    EXECUTE -CHECK, OUTPUT ADDRESS OF (U+LOOP) TO
  708.         THE COMPILE BUFFER, TERMINATE "DO".
  709.         
  710. I    0/1    PUSH COPY OF TOP OF LOOP STACK
  711.  
  712. J    0/1    PUSH COPY OF TOP - 3 OF LOOP STACK
  713.  
  714. K    0/1    PUSH COPY OF TOP - 6 OF LOOP STACK
  715.         
  716. I'    0/1    PUSH (TOP-2)+(TOP-1)-(TOP)-1 OF LOOP STACK
  717.  
  718. J'    0/1    PUSH (TOP-5)+(TOP-4)-(TOP-3)-1 OF LOOP STACK
  719.  
  720. K'    0/1    PUSH (TOP-8)+(TOP-7)-(TOP-6)-1 OF LOOP STACK
  721.  
  722. EXIT    0/0    SET TOP AND TOP - 2 OF LOOP STACK TO 1.
  723.  
  724.  
  725. CHARACTER ORIENTED I/O WORDS
  726. NAME    ARGS    DESCRIPTION
  727.  
  728. IN    0/1    VARIABLE CONTAINING ADDRESS OF INPUT WORD
  729.  
  730. OUT    0/1    VARIABLE CONTAINING ADDRESS OF OUTPUT WORD
  731.  
  732. <TTI>    0/1    READS A BYTE FROM THE TTY KEYBOARD.
  733.         THE BYTE IS NOT ECHOED.
  734.  
  735. <TTO>    1/0    OUTPUT A BYTE TO THE TTY PRINTER.
  736.         COLUMN IS INCREMENTED.
  737.         IF THE CHAR IS A CR, A LF IS OUTPUT AND COLUMN IS ZEROED
  738.         IF THE CHAR IS A TAB, SPACES ARE OUTPUT UNTIL COLUMN = 0 MOD 8
  739.  
  740. TYO    1/0    EXECUTE CONTENTS OF "OUT".
  741.  
  742. TYI    0/1    EXECUTE CONTENTS OF "IN".
  743.  
  744. SPACE    0/0    OUTPUT A SPACE.
  745.  
  746. SPACES    1/0    OUTPUT N SPACES.
  747.  
  748. CR    0/0    OUTPUT A CARRIAGE RETURN
  749.  
  750. TAB    1/0    TAB TO COLUMN N.  NO ACTION TAKEN IF COLUMN
  751.         GREATER OR EQUAL N.
  752.  
  753. COUNT    1/2    GIVEN A POINTER AT TOP, RETURNS CONTENTS OF
  754.         BYTE ADDRESSED BY POINTER AT TOP, VALUE OF
  755.         POINTER + 1 AT TOP - 1.
  756.  
  757. TYPE    2/0    OUTPUT A STRING; BYTE COUNT ON TOP AND
  758.         BYTE POINTER AT TOP - 1.  (USES TYO)
  759.  
  760. RDLINE    0/0    READS AN INPUT LINE INTO THE KEYBOARD BUFFER.
  761.         IF INBLK IS -1, THE LINE IS ACCEPTED FROM THE
  762.         KEYBOARD; OTHERWISE INBLK,INBYTE POINTS TO THE
  763.         BLOCK AND BYTE ON THE MASS STORAGE DEVICE FROM
  764.         WHICH INPUT IS TAKEN.  INBLK AND INBYTE ARE
  765.         UPDATED.  THE LINE IS NULL TERMINATED AND
  766.         PRECEDED BY A BYTE COUNT.  IF EXECUTING FROM THE
  767.         KEYBOARD, RUBOUT, NULL, AND LINE FEED ARE PROCESSED.
  768.         LINE IS TERMINATED BY CR OR FF.  IF KEYBOARD BUFFER
  769.         OVERFLOWS, THE ERROR "KEYBOARD BUFFER FULL" IS GIVEN.
  770.  
  771.  
  772. NUMBER OUTPUT CONVERSION WORDS
  773. NAME    ARGS    DESCRIPTION
  774.  
  775. #CNT    0/1    VARIABLE CONTAINING LENGTH OF CONVERTED STRING
  776.  
  777. #PTR    0/1    VARIABLE CONTAINING POINTER TO CONVERTED STRING
  778.  
  779. <#    0/0    INITIALIZE #CNT TO 0, INITIALIZE #PTR TO
  780.         POINT 40 (OCTAL) BYTES PAST THE CURRENT END OF
  781.         THE DICTIONARY.
  782.  
  783. #PUT    1/0    DECREMENT #PTR, STORE BYTE INDIRECT #PTR
  784.         INCREMENT #CNT.
  785.  
  786. #A    1/1    CONVERT TO NUMBER AT TOP TO AN ASCII
  787.         DIGIT.
  788.  
  789. #    1/1    DIVIDE THE NUMBER ON THE TOP OF THE STACK
  790.         BY RADIX, LEAVING THE QUOTIENT ON THE TOP
  791.         OF THE STACK.  CONVERT THE REMAINDER TO
  792.         AN ASCII DIGIT AND OUTPUT IT VIA #PUT.
  793.  
  794. #S    1/1    EXECUTE # REPEATEDLY UNTIL THE TOP OF THE
  795.         STACK IS ZERO.  # IS ALWAYS EXECUTED AT
  796.         LEAST ONCE.
  797.  
  798. #>    1/2    DISCARD THE TOP OF THE STACK, PUSH THE CONTENTS
  799.         OF #PTR, PUSH THE CONTENTS OF #CNT.
  800.  
  801. <#>    1/2    CONVERT THE NUMBER ON THE TOP OF THE STACK
  802.         TO A STRING.  LEAVE THE BYTE COUNT ON THE TOP
  803.         OF THE STACK, THE BYTE POINTER AT TOP - 1.
  804.         (SIGNED)
  805.  
  806. U<#>    1/2    CONVERT THE NUMBER ON THE TOP OF THE STACK
  807.         TO A STRING.  LEAVE THE BYTE COUNT ON THE TOP
  808.         OF THE STACK, THE BYTE POINTER AT TOP - 1.
  809.         (UNSIGNED)
  810.  
  811. U=    1/0    CONVERT THE NUMBER ON THE TOP OF THE
  812.         STACK TO A STRING AND TYPE IT.
  813.         (UNSIGNED)
  814.  
  815. U?    1/0    TYPE THE CONTENTS OF THE LOCATION
  816.         ADDRESSED BY THE TOP OF THE STACK.
  817.         (UNSIGNED)
  818.  
  819. =    1/0    CONVERT THE NUMBER ON THE TOP OF THE
  820.         STACK TO A STRING AND TYPE IT.
  821.  
  822. ?    1/0    TYPE THE CONTENTS OF THE LOCATION
  823.         ADDRESSED BY THE TOP OF THE STACK.
  824.  
  825. OCTAL    0/0    SET RADIX TO OCTAL
  826.  
  827. DECIMAL    0/0    SET RADIX TO DECIMAL
  828.  
  829. HEX    0/0    SET RADIX TO HEXADECIMAL
  830.  
  831.  
  832. BUFFER HANDLING WORDS
  833.  
  834.     STOIC MAINTAINS A POOL OF SYSTEM BUFFERS WHICH ARE
  835. USED TO HOLD BLOCKS FROM THE STORAGE MEDIUM IN MEMORY.  THEY
  836. ARE ALLOCATED USING A "LEAST RECENTLY USED" ALGORITHM.
  837.  
  838. RBLOCK    1/1
  839.     RETURNS THE ADDRESS OF A BUFFER CONTAINING THE BLOCK
  840.     WHOSE NUMBER IS AT TOP.  WHEN A BLOCK IS REQUESTED USING
  841.     "RBLOCK", IF THE SPECIFIED BLOCK IS ALREADY IN MEMORY,
  842.     ITS ADDRESS IS IMMEDIATELY RETURNED.  IF IT IS NOT IN
  843.     MEMORY, THE LEAST RECENTLY USED BUFFER IS FREED (I.E.
  844.     WRITTEN OUT IF MODIFIED), AND THE BLOCK IS READ IN.
  845.  
  846. WBLOCK    1/1
  847.     RETURNS THE ADDRESS OF A BUFFER CONTAINING THE BLOCK
  848.     WHOSE NUMBER IS AT TOP.  THE BUFFER IS FLAGGED AS
  849.     MODIFIED.  IF THE BLOCK IS NOT ALREADY IN MEMORY, IT
  850.     IS NOT READ IN.
  851.  
  852. FLUSH    0/0
  853.     WRITES OUT ALL MODIFIED BUFFERS.  THIS WORD MUST BE
  854.     EXECUTED BEFORE SHUTTING DOWN THE SYSTEM OR CHANGING
  855.     MEDIA TO ENSURE THAT THE INFORMATION ON THE STORAGE
  856.     MEDIUM IS CURRENT.
  857.  
  858. EBUF    0/0
  859.     FLAGS ALL BUFFERS AS EMPTY.  THIS WORD MUST BE USED
  860.     WHEN CHANGING MEDIA.
  861.  
  862. UPDATE    0/0
  863.     FLAGS THE MOST RECENTLY ACCESSED BUFFER AS MODIFIED.
  864.     WHENEVER THE VALUE OF ANY WORD WITHIN AN I/O BUFFER
  865.     IS MODIFIED, THIS WORD MUST BE CALLED, OTHERWISE THE
  866.     MODIFIED VERSION WILL NOT BE WRITTEN BACK ON THE
  867.     STORAGE MEDIUM.
  868.  
  869. LOAD AND ;F
  870.  
  871. N LOAD    EXECUTES OFF THE DISK STARTING AT BLOCK N.
  872.     INBLK AND INBYTE ARE PUSHED ON THE LOOP STACK
  873.     INBLK IS SET TO N; INBYTE IS SET TO 0.
  874.  
  875. ;F    REVERTS TO EXECUTION FROM CALLING PROGRAM.
  876.     INBYTE AND INBLK ARE POPPED FROM THE LOOP STACK.
  877.  
  878.  
  879. STRING HANDLING WORDS
  880. NAME    ARGS    DESCRIPTION
  881.  
  882. WORD    0/1    GET NEXT STRING FROM THE INPUT STREAM
  883.         DELIMITED BY SPACE OR TAB.  LEADING DELIMITERS
  884.         ARE IGNORED.  DELIMITER SEARCH IS TERMINATED
  885.         BY NULL.  THE STRING IS    STORED ON THE END OF
  886.         THE DICTIONARY.  THE FIRST BYTE OF THE STRING
  887.         IS A CHARACTER COUNT. A NULL IS STORED AT THE
  888.         END OF THE STRING BUT IS NOT INCLUDED IN THE
  889.         CHARACTER COUNT.  END-OF-LINE FLAG IS SET TO -1
  890.         IF END OF LINE IS ENCOUNTERED.  THE VALUE OF
  891.         THE END-OF-LINE FLAG IS RETURNED ON THE STACK.
  892.         IF A " OR \ IS THE FIRST CHARACTER OF A WORD,
  893.         THE DELIMITER IS CHANGED TO " OR \.
  894.  
  895. S,    1/0    STORE STRING POINTED TO BY TOP OF STACK AT
  896.         THE END OF THE DICTIONARY, ".D" IS UPDATED.
  897.  
  898. %    0/0*    SET THE END-OF-LINE FLAG TO -1.
  899.  
  900.  
  901. DICTIONARY SEARCH WORDS
  902. NAME    ARGS    DESCRIPTION
  903.  
  904. LOOKUP    1/(1,2)    TOP OF STACK IS POINTER TO STRING TO BE
  905.         LOOKED UP IN THE DICTIONARY.  A DICTIONARY
  906.         SEARCH IS PERFORMED FOR THE BRANCH OF THE
  907.         DICTIONARY WHOSE ADDRESS IS AT THE TOP OF
  908.         THE VOCABULARY STACK, AND IF MISSING, THE
  909.         BRANCH WHOSE ADDRESS IS AT TOP - 1 IS SEARCHED
  910.         ETC., UNTIL THE BOTTOM OF THE VOCABULARY
  911.         STACK IS REACHED.  AT THIS POINT THE SEARCH
  912.         FAILS.  IF SUCCESSFUL, A -1 IS STORED AT TOP
  913.         AND A POINTER TO THE PARAMETER FIELD OF THE
  914.         MATCHING DICTIONARY ENTRY AT TOP - 1.  OTHERWISE
  915.         A 0 IS LEFT AT TOP.
  916.  
  917. ADDRESS    1/1    EXECUTE "LOOKUP".  TEST THE TOP OF THE
  918.         STACK.  IF ZERO, EXECUTE "ERR" WITH THE
  919.         MESSAGE "UNDEFINED".  OTHERWISE RETURN.
  920.  
  921.  
  922. LITERAL HANDLING WORDS
  923. NAME    ARGS    DESCRIPTION
  924.  
  925. LITERAL    1/0    PROCESS THE LITERAL STRING WHOSE ADDRESS IS AT TOP
  926.  
  927. ILITERAL
  928.     1/(1,2)    A POINTER TO A STRING IS AT TOP.  IF THE STRING
  929.         REPRESENTS A LEGAL INTEGER LITERAL, A -1 IS LEFT AT
  930.         TOP, AND THE LITERAL VALUE IS LEFT AT TOP - 1.
  931.         OTHERWISE, A 0 IS LEFT AT TOP.
  932.  
  933. SLITERAL
  934.     1/1    A POINTER TO A STRING IS AT TOP.  IF THE STRING
  935.         REPRESENTS A LEGAL STRING LITERAL, THE LITERAL
  936.         IS OUTPUT TO THE COMPILE BUFFER PRECEDED BY THE
  937.         ADDRESS OF "S()" AND A -1 IS LEFT ON THE STACK.
  938.         OTHERWISE A 0 IS LEFT AT TOP.
  939.  
  940.  
  941. COMPILER WORDS
  942. NAME    ARGS    DESCRIPTION
  943.  
  944. ^    0/0*    ZEROS THE END-OF-COMMAND FLAG, FORCING COMPILATION
  945.         TO CONTINUE ON TO THE NEXT LINE.
  946.  
  947. PROMPT0    0/0    TYPES THE INITIAL PROMPT MESSAGE, I.E. A CARRIAGE
  948.         RETURN, THE CURRENT VALUE OF "CHECK", AND
  949.         A ">".
  950.  
  951. ERRMSG0    1/0    THE DEFAULT ERROR MESSAGE PRINTER; PRINTS THE ERROR
  952.         MESSAGE AT TOP, THE CURRENT CONTENTS OF THE
  953.         TOKEN BUFFER, AND EXITS VIA "ABORT".
  954.  
  955. UNDEFINED0 0/0    THE DEFAULT UNDEFINED SYMBOL HANDLER; TYPES THE
  956.         MESSAGE "UNDEFINED" AND ABORTS.
  957.  
  958.  
  959.  
  960. ***EOF***
  961.  
  962.