papierkorb:4th_lesson_1
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| papierkorb:4th_lesson_1 [2025-08-16 19:07] – ↷ Seite von projects:4th_lesson_1 nach papierkorb:4th_lesson_1 verschoben mka | papierkorb:4th_lesson_1 [Unbekanntes Datum] (aktuell) – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | === Lesson 1 === | ||
| - | < | ||
| - | \ | ||
| - | \ The Forth Course | ||
| - | \ by Richard E. Haskell | ||
| - | \ Dept. of Computer Science and Engineering | ||
| - | \ Oakland University, Rochester, MI 48309 | ||
| - | comment: | ||
| - | |||
| - | |||
| - | |||
| - | Lesson 1 | ||
| - | |||
| - | | ||
| - | |||
| - | |||
| - | 1.1 INTRODUCTING FORTH 1-2 | ||
| - | |||
| - | 1.2 FORTH ARITHMETIC | ||
| - | |||
| - | 1.3 FORTH ARITHMETIC OPERATORS | ||
| - | |||
| - | 1.4 STACK MANIPULATION WORDS 1-5 | ||
| - | |||
| - | 1.5 MORE FORTH WORDS 1-8 | ||
| - | |||
| - | 1.6 COLON DEFINITIONS | ||
| - | |||
| - | | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | 1.1 INTRODUCING FORTH | ||
| - | |||
| - | Everything in Forth is a word. | ||
| - | |||
| - | Forth words must be separated by a space. | ||
| - | |||
| - | Forth words are stored in a dictionary. | ||
| - | |||
| - | Forth words may be either interpreted or compiled. | ||
| - | |||
| - | When in the interpret mode, a Forth word is executed. | ||
| - | |||
| - | When in the compile mode, a Forth word is stored in the dictionary. | ||
| - | |||
| - | You form Forth phrases by stringing Forth words together. | ||
| - | |||
| - | If you type a Forth word and press < | ||
| - | (Interpret mode). | ||
| - | |||
| - | If you type a number (e.g. 6) and press < | ||
| - | | ||
| - | |||
| - | Forth uses the stack extensively to pass parameters from one word | ||
| - | to the next. This means that the need for variables in Forth | ||
| - | is greatly reduced. | ||
| - | |||
| - | You can define new words in Forth (made up of previously defined | ||
| - | Forth words) that become part of the Forth dictionary, and can | ||
| - | be used like any other Forth word. | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | 1.2 FORTH ARITHMETIC | ||
| - | |||
| - | Forth uses the stack to perform arithmetic operations using postfix | ||
| - | notation. | ||
| - | |||
| - | The stack stores 16-bit values in most Forths including F-PC. | ||
| - | 32-bit Forths, such as MacForth, store 32-bit values on the stack. | ||
| - | Thus, values on the stack will occupy 2 bytes in 16-bit Forths and | ||
| - | 4 bytes in 32-bit Forths. | ||
| - | |||
| - | When you type a number, it is placed on the stack. | ||
| - | numbers in any base. We will see how to change the base later. | ||
| - | The default base is decimal. | ||
| - | value 23h (the suffix h indicates a hex value) will be stored on | ||
| - | the stack as follows | ||
| - | | ||
| - | | 0 0 2 3 | | 0 0 0 0 0 0 2 3 | | ||
| - | | ||
| - | | ||
| - | |||
| - | |||
| - | If you type two numbers, separated by a space, they will both be | ||
| - | stored on the stack. | ||
| - | |||
| - | 127 256 | ||
| - | |||
| - | the two hex values 7Fh and 100h will be stored on the stack as | ||
| - | follows: | ||
| - | | ||
| - | | 0 1 0 0 |<--- top of stack | ||
| - | | ||
| - | | 0 0 7 F | | ||
| - | | ||
| - | |||
| - | Typing .S (or .s) displays the contents of the stack | ||
| - | non-destructively. | ||
| - | |||
| - | 127 256 .s 127 256 ok | ||
| - | |||
| - | The word ok is the Forth prompt. | ||
| - | |||
| - | Values are stored on the stack as signed two's complement numbers. | ||
| - | |||
| - | Thus, for 16-bit Forths the values stored on the stack can range | ||
| - | from -32,768 to +32,767. | ||
| - | |||
| - | For 32-bit Forths the values stored on the stack can range from | ||
| - | -2, | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | 1.3 FORTH ARITHMETIC OPERATORS | ||
| - | |||
| - | The Forth word . (dot) will print the value on top of the stack. | ||
| - | |||
| - | 7 9 . . will print 9 7 | ||
| - | |||
| - | Carriage returns are generally ignored by Forth and are treated | ||
| - | as a blank. | ||
| - | By writing your program in a " | ||
| - | the "stack picture" | ||
| - | backslash \. Anything following a backslash on a line is treated | ||
| - | as a comment and is ignored. | ||
| - | on the stack at each stage of the above example, we could write | ||
| - | |||
| - | Stack picture (top of stack to right) | ||
| - | |||
| - | 7 \ 7 | ||
| - | 9 \ 7 9 | ||
| - | . \ 7 | ||
| - | . \ | ||
| - | |||
| - | Note that the dot removes the value from the stack. | ||
| - | |||
| - | The Forth word + (plus) adds the top two values on the stack and | ||
| - | leaves the result on the stack. | ||
| - | |||
| - | 7 9 + . will print 16 | ||
| - | |||
| - | 7 \ 7 | ||
| - | 9 \ 7 9 | ||
| - | + \ 16 | ||
| - | . \ | ||
| - | |||
| - | The Forth word - (minus) will subtract the value on top of the | ||
| - | stack from the second value on the stack and leave the difference | ||
| - | on the stack. | ||
| - | |||
| - | 8 5 - . will print 3 | ||
| - | |||
| - | 8 \ 8 | ||
| - | 5 \ 8 5 | ||
| - | - \ 3 | ||
| - | . \ | ||
| - | |||
| - | The Forth word * (star) will multiply the top tow values on the | ||
| - | stack and leave the product on the stack. | ||
| - | |||
| - | 4 7 * . will print 28 | ||
| - | |||
| - | 4 \ 4 | ||
| - | 7 \ 4 7 | ||
| - | * \ 28 | ||
| - | . \ | ||
| - | |||
| - | |||
| - | The Forth word / (slash) will divide the second value on the stack | ||
| - | by the value on top of the stack and leave the integer quotient | ||
| - | on top of the stack. | ||
| - | |||
| - | 8 3 / . will print 2 | ||
| - | |||
| - | 8 \ 8 | ||
| - | 3 \ 8 3 | ||
| - | / \ 2 | ||
| - | . | ||
| - | |||
| - | |||
| - | 1.4 STACK MANIPULATION WORDS | ||
| - | |||
| - | Stack picture ( before -- after ) | ||
| - | before = elements on stack before word is executed. | ||
| - | after = elements on stack after word is executed. | ||
| - | |||
| - | DUP ( n -- n n ) | ||
| - | Duplicates the top element on the stack | ||
| - | |||
| - | 5 DUP . . will print 5 5 | ||
| - | |||
| - | 5 \ 5 | ||
| - | DUP \ 5 5 | ||
| - | . \ 5 | ||
| - | . \ | ||
| - | |||
| - | SWAP ( n1 n2 -- n2 n1 ) | ||
| - | Interchanges the top two elements on the stack. | ||
| - | |||
| - | 3 7 SWAP . . will print 3 7 | ||
| - | |||
| - | 3 \ 3 | ||
| - | 7 \ 3 7 | ||
| - | SWAP \ 7 3 | ||
| - | . \ 7 | ||
| - | . \ | ||
| - | |||
| - | DROP ( n -- ) | ||
| - | Removes the top element from the stack. | ||
| - | |||
| - | 6 2 DROP . will print 6 | ||
| - | |||
| - | 6 \ 6 | ||
| - | 2 \ 6 2 | ||
| - | DROP \ 6 | ||
| - | . | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | OVER ( n1 n2 -- n1 n2 n1 ) | ||
| - | Duplicates the second element on the stack. | ||
| - | |||
| - | 6 1 OVER . . . will print 6 1 6 | ||
| - | |||
| - | 6 \ 6 | ||
| - | 1 \ 6 1 | ||
| - | OVER \ 6 1 6 | ||
| - | . \ 6 1 | ||
| - | . \ 6 | ||
| - | . | ||
| - | |||
| - | TUCK ( n1 n2 -- n2 n1 n2 ) | ||
| - | Duplicates the top element on the stack under the second | ||
| - | element. | ||
| - | |||
| - | 6 1 TUCK . . . will print 1 6 1 | ||
| - | |||
| - | 6 \ 6 | ||
| - | 1 \ 6 1 | ||
| - | TUCK \ 1 6 1 | ||
| - | . \ 1 6 | ||
| - | . \ 1 | ||
| - | . | ||
| - | |||
| - | ROT ( n1 n2 n3 -- n2 n3 n1 ) | ||
| - | Rotates the top three elements on the stack. | ||
| - | element becomes the first element. | ||
| - | |||
| - | 3 5 7 ROT . . . will print 3 7 5 | ||
| - | |||
| - | 3 \ 3 | ||
| - | 5 \ 3 5 | ||
| - | 7 \ 3 5 7 | ||
| - | ROT \ 5 7 3 | ||
| - | . \ 5 7 | ||
| - | . \ 5 | ||
| - | . | ||
| - | |||
| - | |||
| - | -ROT ( n1 n2 n3 -- n3 n1 n2 ) | ||
| - | Rotates the top three elements on the stack backwards. | ||
| - | The top element is rotated to third place. | ||
| - | |||
| - | 3 5 7 -ROT . . . will print 5 3 7 | ||
| - | |||
| - | 3 \ 3 | ||
| - | 5 \ 3 5 | ||
| - | 7 \ 3 5 7 | ||
| - | -ROT \ 7 3 5 | ||
| - | . \ 7 3 | ||
| - | . \ 7 | ||
| - | . | ||
| - | |||
| - | |||
| - | NIP ( n1 n2 -- n2 ) | ||
| - | Removes the second element from the stack. | ||
| - | This is equivalent to SWAP DROP. | ||
| - | |||
| - | 6 2 NIP . will print 2 | ||
| - | |||
| - | 6 \ 6 | ||
| - | 2 \ 6 2 | ||
| - | NIP \ 2 | ||
| - | . | ||
| - | |||
| - | |||
| - | 2DUP ( n1 n2 -- n1 n2 n1 n2 ) | ||
| - | Duplicates the top 2 elements on the stack. | ||
| - | |||
| - | 2 4 2DUP .S will print 2 4 2 4 | ||
| - | |||
| - | |||
| - | 2SWAP ( n1 n2 n3 n4 -- n3 n4 n1 n2 ) | ||
| - | Interchanges the top two numbers on the stack with the | ||
| - | third and fourth numbers on the stack. | ||
| - | |||
| - | 2 4 6 8 2SWAP .S will print 6 8 2 4 | ||
| - | |||
| - | |||
| - | 2DROP ( n1 n2 -- ) | ||
| - | Removes the top two elements from the stack. | ||
| - | |||
| - | |||
| - | PICK ( n1 -- n2 ) | ||
| - | Duplicates the value at position n1 from the top of the | ||
| - | stack (not counting n1). The top of the stack corresponds | ||
| - | to n1 equal to 0. | ||
| - | |||
| - | 0 PICK is the same as DUP | ||
| - | 1 PICK is the same as OVER | ||
| - | |||
| - | 2 4 6 8 2 PICK .S will print 2 4 6 8 4 | ||
| - | |||
| - | |||
| - | ROLL ( n -- ) | ||
| - | Rotate the value at position n (not counting n) to the | ||
| - | top of the stack. | ||
| - | |||
| - | 1 ROLL is the same as SWAP | ||
| - | 2 ROLL is the same as ROT | ||
| - | |||
| - | 2 4 6 8 3 ROLL .S will print 4 6 8 2 | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | 1.5 MORE FORTH WORDS | ||
| - | |||
| - | MOD ( n1 n2 -- n3 ) | ||
| - | Divides n1 by n2 and leaves the remainder n3 on the stack. | ||
| - | |||
| - | 8 3 MOD . will print 2 | ||
| - | |||
| - | |||
| - | /MOD ( n1 n2 -- n3 n4 ) | ||
| - | Divides n1 by n2 and leaves the quotient n4 on top of the | ||
| - | stack and the remainder n3 as the second element on the | ||
| - | stack. | ||
| - | |||
| - | 10 3 /MOD .S will print 1 3 | ||
| - | |||
| - | |||
| - | MIN ( n1 n2 -- n3 ) | ||
| - | Leaves the smaller of n1 and n2 on the stack. | ||
| - | |||
| - | 8 3 MIN . will print 3 | ||
| - | |||
| - | |||
| - | MAX ( n1 n2 -- n3 ) | ||
| - | Leaves the larger of n1 and n2 on the stack. | ||
| - | |||
| - | 8 3 MAX . will print 8 | ||
| - | |||
| - | |||
| - | NEGATE | ||
| - | Changes the sign of n1. | ||
| - | |||
| - | 8 NEGATE . will print -8 | ||
| - | |||
| - | |||
| - | ABS ( n1 -- n2 ) | ||
| - | Leaves the absolute value of n1 on the stack. | ||
| - | |||
| - | -8 ABS . will print 8 | ||
| - | |||
| - | |||
| - | 2* ( n1 -- n2 ) | ||
| - | Multiplies n1 by 2 by performing an arithmetic shift left. | ||
| - | |||
| - | 8 2* . will print 16 | ||
| - | |||
| - | This is equivalent to 8 2 * but is faster. | ||
| - | |||
| - | |||
| - | 2/ ( n1 -- n2 ) | ||
| - | Divides n1 by 2 by performing an arithmetic shift right. | ||
| - | |||
| - | 8 2/ . will print 4 | ||
| - | |||
| - | This is equivalent to 8 2 / but is faster. | ||
| - | |||
| - | U2/ ( n1 -- n2 ) | ||
| - | Performs a 16-bit logical shift right. | ||
| - | |||
| - | 40000 U2/ . will print 20000 | ||
| - | but 40000 2/ . will print -12768 | ||
| - | |||
| - | |||
| - | 8* ( n1 -- n2 ) | ||
| - | Multiplies n1 by 8 by performing a 3-bit arithmetic shift | ||
| - | left. | ||
| - | |||
| - | 7 8* . will print 56 | ||
| - | |||
| - | This is equivalent to 7 8 * but is faster. | ||
| - | |||
| - | |||
| - | 1+ ( n1 -- n2 ) | ||
| - | Increments the top of the stack by one. | ||
| - | |||
| - | |||
| - | 1- ( n1 -- n2 ) | ||
| - | Decrements the top of the stack by one. | ||
| - | |||
| - | |||
| - | 2+ ( n1 -- n2 ) | ||
| - | Increments the top of the stack by two. | ||
| - | |||
| - | |||
| - | 2- ( n1 -- n2 ) | ||
| - | Decrements the top of the stack by two. | ||
| - | |||
| - | |||
| - | U/16 ( u -- u/16 ) \ u signifies an unsigned 16-bit integer | ||
| - | Divides the unsigned integer u by 16 by performing a 4-bit | ||
| - | logical shift right. | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | 1.6 COLON DEFINITIONS | ||
| - | |||
| - | You can define your own Forth words, made up of other Forth words, | ||
| - | by using the Forth word : (colon) in the following form: | ||
| - | |||
| - | : < | ||
| - | |||
| - | where | ||
| - | the colon : begins the definition | ||
| - | < | ||
| - | --- --- are the Forth words making up you definition | ||
| - | the semi-colon ; ends the definition. | ||
| - | |||
| - | Examples: | ||
| - | |||
| - | If you don't like the period to print the value of the top of the | ||
| - | stack, you could redefine it to be == (We'll use the double equal | ||
| - | sign because the single equal sign = is already a Forth word). | ||
| - | |||
| - | Note: Paren ( is a Forth word that treats everything to the closing | ||
| - | paren ) as a comment. | ||
| - | the (. | ||
| - | |||
| - | comment; | ||
| - | \ Lesson 1 up to this point. | ||
| - | \ all of the words between comment: and comment; will be | ||
| - | \ treated as a comment and ignored. | ||
| - | \ colon definitions will be compiled by loading them into | ||
| - | \ the dictionary. | ||
| - | \ yourself from the keyboard, or you can just type | ||
| - | \ FLOAD LESSON1. | ||
| - | |||
| - | : == ( n -- ) \ print the top value of the stack | ||
| - | . ; | ||
| - | |||
| - | \ Type in this colon definition and then try it by | ||
| - | \ typing | ||
| - | |||
| - | : squared | ||
| - | DUP * ; | ||
| - | |||
| - | \ Try typing | ||
| - | \ 5 squared == | ||
| - | \ 3 squared == | ||
| - | \ 7 squared == | ||
| - | |||
| - | : cubed ( n -- n**3 ) \ compute the cube of n | ||
| - | DUP \ n n | ||
| - | squared | ||
| - | * ; \ n**3 | ||
| - | |||
| - | \ Try typing | ||
| - | \ 3 cubed == | ||
| - | \ 5 cubed == | ||
| - | \ 10 cubed == | ||
| - | |||
| - | comment: | ||
| - | The following are two useful Forth words: | ||
| - | |||
| - | CR ( -- ) ( " | ||
| - | Produces a " | ||
| - | |||
| - | ." | ||
| - | Prints a string consisting of characters to closing ". | ||
| - | comment; | ||
| - | \ Define the following words: | ||
| - | |||
| - | : bar ( -- ) \ print a bar | ||
| - | CR ." *****" ; | ||
| - | |||
| - | \ Type bar | ||
| - | |||
| - | : post ( -- ) \ print a post | ||
| - | CR ." *" | ||
| - | CR ." *" ; | ||
| - | |||
| - | \ Type post | ||
| - | |||
| - | : C ( -- ) \ print a C | ||
| - | bar | ||
| - | post | ||
| - | post | ||
| - | bar ; | ||
| - | |||
| - | \ Type C | ||
| - | |||
| - | : E ( -- ) \ print an E | ||
| - | bar post | ||
| - | bar post | ||
| - | bar ; | ||
| - | |||
| - | \ Type E | ||
| - | |||
| - | comment: | ||
| - | Note that new Forth words are defined in terms of previously | ||
| - | defined words. | ||
| - | words are continually being defined. | ||
| - | entire main program will be just one word. | ||
| - | |||
| - | The words you define are stored in the Forth dictionary along with | ||
| - | all the pre-defined Forth words. | ||
| - | language and are treated just like any other Forth word. The Forth | ||
| - | interpreter cannot tell the difference between words that you define | ||
| - | and words that come as part of the language. | ||
| - | Forth application program is really a specialized language that is | ||
| - | designed to solve a particular problem. | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | EXERCISE 1.1 | ||
| - | A rectangle can be defined by giving its top-left (t l) and | ||
| - | bottom-right (b r) coordinates. | ||
| - | from left to right and the y-coordinate increase from top to | ||
| - | bottom. | ||
| - | will calculate the area, circumference and center of the rectangle | ||
| - | given the top, left, bottom and right values on the stack as follows: | ||
| - | |||
| - | AREA ( t l b r -- area ) | ||
| - | |||
| - | CIRCUM | ||
| - | |||
| - | CENTER | ||
| - | |||
| - | Test your three words using the following two sets of values for | ||
| - | top, left, bottom and right: | ||
| - | |||
| - | top: 31 10 | ||
| - | left: | ||
| - | bottom: 94 215 | ||
| - | right: | ||
| - | |||
| - | comment; | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | </ | ||
papierkorb/4th_lesson_1.1755364027.txt.gz · Zuletzt geändert: 2025-08-16 19:07 von mka