=== 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:.BLK ( Start F83 with VEDIT .) 2 F83 .BLK ( Start original F83 ) 3 BYE ( Exit FORTH, return to DOS.) 4 WORDS ( List all words in dictionary.) 5 FORGET ( Remove and all following ) 6 ( words from the dictionary.) 7 EMPTY ( Remove all new words added since ) 8 ( this session was started.) 9 : .... ; ( Create new word .) 10 ." " ( Compile the into the ) 11 ( dictionary. will be ) 12 ( printed when word is executed. ) 13 ( Do not use outside a colon def.) 14 .( ) ( 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 .BLK ( Open an existing screen file.) 5 \ Create a new screen file .BLK with n blank screens.) 6 CREATE-FILE .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 6 7 where is the word to be debugged or traced. When the 8 word 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 .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