EXAMPLES FOR LECTURE #2
Screen 0 not modified
0 \ EXAMPLES FOR LECTURE #2 17:42JWB09/21/85
1 \ Last change: Screen 019 09:57JWB01/17/86
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Screen 1 not modified
0 \ REVIEW - 1 17:56JWB09/21/85
1 FORTH83 B:<name>.BLK ( Start F83 with VEDIT .)
2 F83 <name>.BLK ( Start original F83 )
3 BYE ( Exit FORTH, return to DOS.)
4 WORDS ( List all words in dictionary.)
5 FORGET <name> ( Remove <name> and all following )
6 ( words from the dictionary.)
7 EMPTY ( Remove all new words added since )
8 ( this session was started.)
9 : <name> .... ; ( Create new word <name> .)
10 ." <string> " ( Compile the <string> into the )
11 ( dictionary. <string> will be )
12 ( printed when word is executed. )
13 ( Do not use outside a colon def.)
14 .( <string> ) ( Print string to terminal. Use )
15 ( outside a colon definition. )
Screen 2 not modified
0 \ REVIEW - 2 18:15JWB09/21/85
1 last first DO ... LOOP ( Use within a colon def to )
2 ( loop from first to last. )
3 last first ?DO ... LOOP ( Same as above except loop )
4 ( 0 times if first=last )
5 BEGIN .... AGAIN ( Use within a colon def to )
6 ( create an infinite loop. )
7 SPACE ( -- -- ) ( Send a space to the display.)
8 SPACES ( n -- ) ( Send n spaces to display. )
9 CR ( -- -- ) ( Start a new line on display.)
10 EMIT ( n -- ) ( Display ASCII character n .)
11 . ( n -- ) ( Send top of stack to display.)
12 + ( m n sum ) ( Leave sum: sum = m + n )
13 - ( m n dif ) ( Leave difference: dif = m - n)
14 * ( m n prod ) ( Leave product: prod = m * n )
15 .S ( -- -- ) ( Non destructive stack print. )
Screen 3 not modified
0 \ REVIEW - 3 18:34JWB09/21/85
1 MAX ( m n max ) ( Leave larger of m and n )
2 MIN ( m n min ) ( Leave smaller of m and n )
3 DEPTH ( -- n ) ( Leave count of stack items.)
4 \ ( Comment to end of line )
5 ( this is a comment )
6 A: ( -- -- ) ( Make the current drive A )
7 B: ( -- -- ) ( Make the current drive B )
8 DIR ( -- -- ) ( List current drive directory.)
9 LIST ( n -- ) ( List screen or block n .)
10 LOAD ( n -- ) ( Compile screen n .)
11 INDEX ( m n -- ) ( Index screens m through n .)
12 L ( -- -- ) ( List the current screen. )
13 N L ( -- -- ) ( List the next screen. )
14 B L ( -- -- ) ( List the previous screen.)
15
Screen 4 not modified
0 \ REVIEW - 4 18:49JWB09/21/85
1 FILE? ( -- -- ) ( Display current screen file.)
2 DEFAULT ( -- -- ) ( Revert to default screen file)
3 ( used when FORTH was started.)
4 OPEN <name>.BLK ( Open an existing screen file.)
5 \ Create a new screen file <name>.BLK with n blank screens.)
6 CREATE-FILE <name>.BLK ( n -- )
7 MORE ( n -- ) ( Add n blank screens to the )
8 ( end of the current screen file)
9 QUERY ( -- -- ) ( Fetch a line of text from user)
10 INTERPRET ( -- -- ) ( Interpret the text line word by
11 ( word.)
12 VEDIT ( n -- ) ( Begin editing screen n )
13 VED ( -- -- ) ( Begin editing current screen )
14 CAPACITY ( -- n ) ( Leave number of screens in the
15 ( current screen file.)
Screen 5 not modified
0 \ EXAMPLES -1 09:55JWB01/17/86
1 \ Clear the data (or parameter stack).
2 : CLEAR ( ?? empty )
3 DEPTH 0 ?DO DROP LOOP ;
4
5 \ Count from 0 to n .
6 : COUNT_UP ( n -- )
7 0 ?DO CR \ Advance to new line.
8 I \ Fetch current value of loop counter.
9 . \ Display it.
10 LOOP ; EXIT
11
12
13
14
15
Screen 6 not modified
0 \ DEBUGGER 09:54JWB01/17/86
1 The debugger is designed to let the user single step through
2 the execution sequence of a high level definition. This process
3 is also called tracing. To activate the debugger type:
4
5 DEBUG <name>
6
7 where <name> is the word to be debugged or traced. When the
8 word <name> is next executed you will get a single step trace
9 showing the next word to be executed and the contents of the
10 data stack. Press any key except C F or Q for the next step.
11 Q - Quit debugging process.
12 C - Continue without pausing between steps.
13 F - Return to FORTH to execute other commands.
14 - You must type RESUME to continue debugging.
15 UNBUG - Disconect the debugger or you may crash and burn.
Screen 7 not modified
0 \ NEW WORDS 09:55JWB01/17/86
1 \ You add the stack comments and descriptions.
2
3 DROP
4 SWAP
5 DUP
6 OVER
7 ROT
8 -ROT
9
10 2DROP
11 2SWAP
12 2DUP
13 2OVER
14
15
Screen 8 not modified
0 \ EXAMPLE - 2 Volume of a tank. 09:56JWB01/17/86
1
2 : TANK_VOLUME ( l w h -- )
3 CR ROT DUP ." Length " . ." feet"
4 CR ROT DUP ." Width " . ." feet"
5 CR ROT DUP ." Height " . ." feet"
6 CR * * ." Volume " . ." cubic feet." ;
7
8 \ Explain FACTORING .
9 \ Show the effect of an incomplete definition.
10 \ More New Words Below.
11 \ HIDE ( -- -- ) Mark last word so it cannot be found.
12 \ REVEAL ( -- -- ) Mark last word so it can be found.
13 \ [ Stop compiling and resume interpretation.
14 \ ] Stop interpreting and resume compilation.
15
Screen 9 not modified
0 \ EXAMPLE - 3 Volume of a tank factored. 22:32jwb09/21/85
1
2 : .ECHO ( a b c b c a )
3 ROT DUP . ;
4
5 : .FT ( -- -- )
6 ." feet." CR ;
7
8 : TANK_VOLUME ( l w h -- )
9 CR ." Length " .ECHO .FT
10 ." Width " .ECHO .FT
11 ." Height " .ECHO .FT
12 * * ." Volume " . ." cubic" .FT ;
13
14
15
Screen 10 not modified
0 \ EXAMPLE - 4 Surface area of closed tank 09:56JWB01/17/86
1 \ New Words I made up the ones below
2 \ PICK all by myself!!
3 \ ROLL
4 \ NIP SPIN ( a b c c b a )
5 \ TUCK HATCH ( a b c a b b c )
6 \ 3DUP SHOVE ( a b c c a b c )
7
8 : TANK_AREA ( l w h -- ) \ add stack comments for each line
9 3DUP ( )
10 5 ROLL * 2 * ( )
11 -ROT * 2 * ( )
12 + ( )
13 -ROT * 2 * ( )
14 + ( )
15 CR ." Surface area of tank is " . ." square" .FT ;
Screen 11 not modified
0 \ PROBLEM - 1 Rectangle area & perimeter 09:56JWB01/17/86
1
2 a) Write a word called .LW that takes two stack items, a
3 length and a width and echos the values on separate lines
4 with identifiers. Note .LW should leave stack empty.**
5 b) Write a word called AREA that takes two stack items, a
6 length and a width, and computes and displays the area of a
7 rectangle. Note AREA should leave the stack empty.**
8 c) Write a word call PERIMETER that takes two stack items, a
9 length and a width, and computes and displays the perimeter
10 of a rectangle. Note PERIMETER should leave stack empty.**
11 d) Write a word called RECTANGLE that takes two stack items, a
12 length and a width, and performs the functions of a b & c .
13 Did you use the .LW , AREA , and PERIMETER in your
14 definition of RECTANGLE?
15 ** It would be better to say: it consumes its stack parameters.
Screen 12 not modified
0 \ PROBLEW-2 Tank volume and surface area 09:56JWB01/17/86
1
2 Write words .LWH VOLUME and AREA along the lines
3 of the previous problem except that they take 3 stack items,
4 length, width, and height. VOLUME computes the volume of the
5 tank. AREA computes the surface area of the tank. Combine
6 these into a single word TANK which performs the function
7 of all three as in PROBLEM - 1.
8
9
10
11
12
13
14
15
Screen 13 not modified
0 \ PROBLEM - 3 Rectangle again. 09:56JWB01/17/86
1 The area and perimeter of a rectangle -----------(X2,Y2)
2 can be determined from the coordinates | |
3 of either pair of opposite corners. | |
4 A = ( X2 - X1 )*( Y2 - Y1) | |
5 P = 2*(( X2 - X1 )+( Y2 - Y1)) -----------
6 (X1,Y1)
7 Write words to find the length, width, area, and perimeter
8 and then combine them into one one word as in problem 1.
9 Can any of the work from problem 1 be used here?
10 Do your words work if you feed them upper left and lower
11 right coordinates?
12
13
14
15
Screen 14 not modified
0 \ PROBLEM - 4 Falling objects. 09:56JWB01/17/86
1 The height of a falling object above the ground at time t
2 seconds is given by
3 height = h0 - v0*t - 16*t*t
4 where h0 is the initial height in feet
5 and v0 is the initial velocity in feet per second.
6 Write a word called HEIGHT that takes initial height
7 initial velocity and a time from the stack and produces the
8 following output.
9
10 You type: 1000 100 3 HEIGHT ( return )
11 And see : Initial height is 1000 feet.
12 Initial velocity is 100 feet per second.
13 Height after 3 seconds is 412 feet.
14 Does your solution consist of one long definition?
15 ( the 412 above may be wong!! )
Screen 15 not modified
0 \ DIVISION A real can of worms. 09:56JWB01/17/86
1 /
2 MOD
3 /MOD
4
5
6
7
8
9 : TRIANGLE.AREA ( b h -- )
10 * 2 / ;
11
12
13
14
15
Screen 16 not modified
0 \ EASY WORDS 09:56JWB01/17/86
1
2 1+
3 2+
4 1-
5 2-
6 2*
7 2/
8
9 ABS
10
11 NEGATE
12
13
14
15
Screen 17 not modified
0 \ DISPLAYING A TABLE contains error!!! 09:57JWB01/17/86
1 \ New word: .R ( n w -- )
2 \ Print n right justified in a field w wide.
3 : .ONE ( n -- )
4 12 SPACES \ Indent table entry.
5 DUP 8 .R \ Print number.
6 DUP DUP * 8 .R \ Print square of number.
7 DUP DUP DUP * * 8 .R ; \ Print cube of number.
8 : .HEADING ( -- -- )
9 CR CR CR 14 SPACES
10 ." NUMBER SQUARE CUBE" ;
11 : .TABLE ( first last -- )
12 .HEADING \ ?ENOUGH explain it.
13 1+ SWAP
14 ?DO CR I .ONE LOOP
15 CR CR ;
Screen 18 not modified
0 \ PROBLEM - 5 Tables for Tanks. 09:57JWB01/17/86
1 a)Modify the previous example so that it gives a table of
2 volumes and surface areas of cubical tanks.
3 The new heading should have the form:
4 SIDE SURFACE AREA VOLUME
5 feet square feet cubic feet
6 ==== ============ ==========
7 Entries should be neatly centered under the table headings!!
8
9 b)Repeat the above problem for spherical tanks. Heading
10 should read: RADIUS SURFACE AREA VOLUME etc.
11 For a sphere V = 4 pi R*R*R/3
12 S = 4 pi R*R
13 pi = 3.1416
14 Hint: to multiply by pi see Brodie page 122 or use -
15 : *PI ( n n*pi ) 355 113 */ ;
Screen 19 not modified
0 \ ASCII TABLE 09:57JWB01/17/86
1 : .ONE ( n -- )
2 12 SPACES DUP EMIT DUP 4 .R
3 HEX 4 .R DECIMAL ;
4 : .HEADING ( -- -- )
5 CR CR CR 9 SPACES ." CHAR DEC HEX" ;
6 : ATABLE ( first last -- )
7 .HEADING
8 1+ 256 MIN
9 SWAP 0 MAX
10 ?DO CR I .ONE LOOP ;
11 : .TABLE ( -- -- )
12 16 0 DO I 16 * DUP 15 +
13 ATABLE KEY DROP
14 LOOP ;
15
Screen 20 not modified
0 \ Notes on Starting Forth. 1 17:12JWB09/22/85
1 \ P 50 Replace 'S with SP@ or define : 'S SP@ ;
2 \ Replace S0 with SP0 or define : S0 SP0 ;
3 \ Because FORTH83 loops work differently you should use:
4 : .S CR SP@ SP0 @ 2DUP <>
5 IF 2- DO I @ . -2 +LOOP
6 ELSE 2DROP ." EMPTY" THEN ;
7 \ Or just use .S that is already part of your system.
8
9 \ P 66-72 Use: n VEDIT to edit screen n .
10 \ The original F83.COM fill supports the STARTING FORTH style
11 \ editor. Go back to DOS and type F83 <name>.BLK to try it.
12 \ P 83 See notes for P 50 above. Also VIEW .S to see how
13 \ the F83 version is implemented.
14
15
Screen 21 not modified
0 \ Notes on Starting Forth. 2 17:12JWB09/22/85
1 \ P 110 In F83 I J and K are used only within loops to fetch
2 \ the current values of the loop counters. Use R@
3 \ instead of I to fetch a copy of the top of the return
4 \ stack to the parameter stack without changing the
5 \ return stack.
6 \ Use the sequence: R> R@ SWAP >R within a definition
7 \ instead of I' to fetch a copy of the second item on
8 \ the return stack. Or use the definition:
9 : 2R@ R> R> R@ -ROT >R >R ;
10 \ Use 2R@ for I' . I' is a poor name!!
11 \ WARNING! It is dangerous to mess with the return stack.
12 \ P112 Use R@ instead of I , also a dot . was ommited
13 \ from the definition of QUADRATIC. See below.
14 : QUADRATIC ( a b c x n )
15 >R SWAP ROT R@ * + R> * + . ;
Screen 22 not modified
0 \ Notes on Starting Forth. 3 17:13JWB09/22/85
1 \ P 119 Error in footnote!
2 : R% 50 */ 1+ 2/ ;
3 \ P 123 I I' and J see comments for page 110.
4 \ P 131 For COMPOUND to display as in text insert a CR
5 \ before SWAP . ie : COMPOUND CR SWAP 21 0 DO etc
6 \ P 135 There is an error in TEST - should be 10 10 DO but
7 \ even so . . the FORTH83 DO .. LOOP is not like
8 \ the one in Starting FORTH !!!! Try the following
9 : -TEST DO I . ?KEY ?LEAVE ( any key exit ) -1 +LOOP ;
10 : +TEST DO I . ?KEY ?LEAVE ( any key exit ) 1 +LOOP ;
11 \ 9 10 +TEST loops 65534 times. 9 10 -TEST gives 10 9
12 \ 10 10 +TEST loops 65535 times. 10 10 -TEST gives 10
13 \ 11 10 +TEST gives 10 11 10 -TEST loops 65535 times
14 \ If you try any of the longer loops above press any key to
15 \ abort!!
Screen 23 not modified
0 \ Notes on Starting Forth. 4 17:13JWB09/22/85
1 \ P 137 XX will clear the stack as indicated but our definition
2 \ : CLEAR DEPTH 0 ?DO DROP LOOP ; will do it without
3 \ the error message. An alternate definition of CLEAR is:
4 : CLEAR SP0 @ SP! ;
5 \ P 140 In FORTH83 LEAVE causes an immediate exit from the
6 \ DO ... LOOP !! Thus any words between LEAVE and LOOP
7 \ will not be executed if the condition for leaving is
8 \ is satisfied. Try the following and note that HELLO
9 \ is not printed the last time.
10 : HELLOS 10 1 DO CR I . I 5 = IF LEAVE THEN ." HELLO" LOOP ;
11 \ Note: ?LEAVE can replace the phrase IF LEAVE THEN
12 \ P 142-143 Use CLEAR-SCREEN definition below instead of PAGE
13 : CLEAR-SCREEN 0 0 0 2 [ EDITOR ] VIDEO-IO 2DROP 2DROP ; FORTH
14
15
Screen 24 not modified
0 \ Notes on Starting Forth. 5 17:13JWB09/22/85
1 \ P 161 In FORTH83 UM* is the name for U*
2 \ and UM/MOD is the name for U/MOD
3 \ In FORTH83 all loops are relative, use +LOOP for /LOOP
4 \ P 164 Double number punctuation is . only! not ,
5 \ P 166 Use the . for the , in the double numbers!!!
6 \ P 169 FORTH83 SIGN uses the first number on the stack!!
7 \ Whenever Brodie uses SIGN replace it with ROT SIGN
8 \ P 170 Replace SIGN with ROT SIGN
9 \ VIEW D. to see how F83 formats numbers.
10 \ P 172 Replace SIGN with ROT SIGN
11 \ P 174 Use the definitions below:
12 : M+ S>D D+ ; : M/ M/MOD NIP ;
13 : M*/ 2DUP XOR SWAP ABS >R SWAP ABS >R OVER XOR -ROT
14 DABS SWAP R@ UM* ROT R> UM* ROT 0 D+ R@ UM/MOD
15 -ROT R> UM/MOD NIP SWAP ROT ?DNEGATE ;
Screen 25 not modified
0 \ Notes on Starting Forth. 6 17:28JWB09/22/85
1 \ P 177 In FORTH83 use UM* for U* and UM/MOD for U/MOD
2 \ In FORTH83 use +LOOP for /LOOP
3 \ P 178 Use ROT SIGN where ever Brodie uses SIGN !!
4 \ P 202 Use CLEAR-SCREEN definition given earlier for PAGE
5 \ P 204 Use +LOOP for /LOOP
6 \ P 215 Type VIEW INTERPRET for definition of our INTERPRET
7 \ P 217 In F83 DEFER is used for execution vectors.
8 \ P 233 In F83 the variable H is called DP
9 \ P 235-237 : 'S SP@ ;
10 \ P 240 Use DP instead of H ; No OFFSET in this system.
11 \ P 242 F83 Uses the ONLY vocabulary structure. See the FORTH-83
12 \ standard or wait till we discuss it in class.
13 \ P 247 Use DP instead of H .
14
15
Screen 26 not modified
0 \ BYTE 21:51JWB09/22/85
1 - the smallest piece of data that can be accessed by most modern
2 micro-computers.
3 - consists of a cell of 8 binary bits: 01110101 <= see the byte
4 - the low order bit is number 0. 76543210 <= bit number
5 - the high order bit is number 7.
6 - the bit pattern in a byte can represent an unsigned integer:
7 0 - 255 decimal
8 00000000 - 11111111 binary
9 00 - FF hexadecimal
10 - the data structure often represented by bytes is the ASCII
11 character.
12 0 20 control characters.
13 21 127 common symbols, digits, letters.
14 128 255 in the IBM-PC the extended character set.
15
Screen 27 not modified
0 \ WORD 22:14JWB09/22/85
1 - a word consists of two bytes or 16 binary bits.
2 - most easily represented by four hexadecimal digits.
3 - examples: A123 FEED DEAD
4 - the bit pattern in a word can represent an unsigned integer:
5 0 - 65535 decimal 0000 - FFFF hexadecimal
6 - micro computers can access 65,535 memory cells (bytes) using
7 the word as an address pointer.
8 - the bit pattern in a word can also represent signed integers:
9 -32768 - 32767 decimal -8000 - 7FFF hexadecimal
10 - In FORTH each data stack number is represented by a word.
11 - In FORTH address are represented by words or unsigned integers
12 thus FORTH can address or access 65535 bytes of memory.
13
14
15
Screen 28 not modified
0
1
2 ONLY FORTH ALSO ALSO DEFINITIONS
3
4 CODE SPLIT
5 AX POP \ Get number from stack
6 BH BH SUB \ Clear high bits of BX
7 AL BL MOV \
8 BX PUSH
9 AH BL MOV
10 BX PUSH
11 NEXT
12 END-CODE
13
14
15