Benutzer-Werkzeuge

Webseiten-Werkzeuge


papierkorb:sample4.blk

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

papierkorb:sample4.blk [2025-08-16 17:50] – ↷ Seite von projects:sample4.blk nach papierkorb:sample4.blk verschoben mkapapierkorb:sample4.blk [Unbekanntes Datum] (aktuell) – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1
Zeile 1: Zeile 1:
-=== EXAMPLES FOR LECTURE #4 === 
-<code> 
-Screen 0 not modified      
- 0 \ EXAMPLES FOR LECTURE #4                      15:51JWB04/22/87  
- 1 \ Last change:   Screen  000                   15:51JWB04/22/87  
-         Interval logic.                                          
-         Numeric input.                                           
-         The return stack.                                        
-         Average and Histogram programs.                          
-         Square root.                                             
-         Area and Hypotenuse of a right triangle.                 
-         F83 memory map.                                          
-         Memory operators.                                        
-10         Variables and constants.                                 
-11         Pythagorean triples.                                     
-12         Arrays.                                                  
-13         User stacks.                                             
-14         An application for FORTH to Survey Technology.           
-15                                                                  
  
- 
-Screen 1 not modified      
- 0 \  Load screen for help system.                15:36JWB04/22/87  
-                                                                  
- 2 \ The word FROM temporarily redirects the input to the           
- 3 \ indicated block file for ONE screen load only.                 
- 4 \ However.... that one screen could specify that others be       
- 5 \ loaded.  This is the case with screen one of sample1.blk.      
- 6 \ Go back and check it yourself.                                 
-                                                                  
-         FROM A:SAMPLE1.BLK 1 LOAD    \ Load the HELP system.     
-         FROM A:SAMPLE1.BLK 9 LOAD    \ Load MQUIT                
-10         FROM B:SAMPLE3.BLK 28 LOAD   \ HEX AND BINARY #PRINT     
-11                                                                  
-12                                                                  
-13                                                                  
-14                                                                  
-15                                                                  
- 
- 
-Screen 2 not modified      
- 0 \ REVIEW - 1    NUMBER DISPLAY                 19:57JWB10/02/85  
- 1 \ Single signed 16bit numbers.   -32768 - 32767                  
-       ( n     -- )  Display signed 16bit # followed by space.  
-   .R    ( n w   -- )  Display # right justified in w wide field. 
-                                                                  
- 5 \ Single unsigned 16bit numbers.  0 - 65535                      
-   U.    ( u     -- )  Display unsigned 16bit # followed by space 
-   U.R   ( u w   -- )  Display # right justified in w wide field. 
-                                                                  
- 9 \ Double signed 32bit numbers   -2,147,483,648 - 2,147,483,647   
-10  D.     ( d     -- )  Display signed 32bit # followed by space.  
-11  D.R    ( d w   -- )  Display # right justified in w wide field. 
-12                                                                  
-13 \ Double unsigned 32bit numbers.  0 - 4,294,967,296              
-14  UD.    ( ud    -- )  Display unsigned 32bit # followed by space 
-15  UD.R   ( ud w  -- )  Display # right justified in w wide field. 
- 
- 
-Screen 3 not modified      
- 0 \ REVIEW - 2   CONDITIONALS                    20:28JWB10/02/85  
-   tf = -1 = 1111111111111111  binary or base 2                   
-   ff =  0 = 0000000000000000  binary or base 2                   
-   TRUE  ( --   tf )     Leave true flag on top of data stack.    
-   FALSE ( --   ff )     Leave false flag on top of data stack.   
-                                                                  
-       ( n m   flag )  Leave tf if n = m , otherwise ff.        
-   <>    ( n m   flag )  Leave tf if n<> m , otherwise ff.        
-   <     ( n m   flag )  Leave tf if n < m , otherwise ff.        
-   >     ( n m   flag )  Leave tf if n > m , otherwise ff.        
-10                                                                  
-11   0=    ( n    flag )   Leave tf if n = 0 , otherwise ff.        
-12   0<>   ( n    flag )   Leave tf if n<> 0 , otherwise ff.        
-13   0<    ( n    flag )   Leave tf if n < 0 , otherwise ff.        
-14   0>    ( n    flag )   Leave tf if n > 0 , otherwise ff.        
-15   ?DUP  ( n    n (n)  ) Duplicate n if n is non zero.            
- 
- 
-Screen 4 not modified      
- 0 \ REVIEW - 3  CONDITIONALS                     14:17JWB10/06/85  
- 1 \ Note: These operators work at the binary bit level!!           
-   AND   ( f1 f2  flag ) Leave tf only if f1 and f2 are true.     
-   OR    ( f1 f2  flag ) Leave tf if either f1 or f2 are true.    
-   XOR   ( f1 f2  flag ) Leave tf if f1=tf or f2=tf but not both. 
-   NOT   ( f1   not-f1 ) Reverse the flag f1.                     
-       1100      1100      1100                                   
-       1010      1010      1010      1010                         
-       ----      ----      ----      ----                         
-   AND 1000   OR 1110  XOR 0110  NOT 0101                         
-10   Note:  Starting FORTH  NOT  is the same as F83  0=             
-11          Starting FORTH  NOT  is different than F83  NOT         
-12          F83  NOT operates on each of a numbers 16 bits.         
-13          F83  NOT leaves a false flag ( zero ) only if it        
-14            operates on a true flag  -1=1111111111111111 binary   
-15          F83  NOT  is not the same as  0=                        
- 
- 
-Screen 5 not modified      
- 0 \ REVIEW - 4    Miscellaneous                  22:05JWB10/02/85  
-   ASCII         ( --   n )  Leave character code of ASCII X    
-   CONTROL X       ( --   n )  Leave character code of control X  
-   ABORT" <text>"  ( flg  -- ) Abort if flg is true.              
-   KEY             ( --    ) Return code n for key pressed.     
-   BEEP            ( --  -- )  Make a beep.                       
-   -->             ( --  -- )  Load the next screen.              
-   THRU    ( first last  -- )  Load screens first through last.   
-                                                                  
- 9 \ IF  ELSE  THEN                                                 
-10   si = step i     ci = condition i                               
-11 \ Do step 2 if condition 1 is true.                              
-12   s1  c1  IF  s2  THEN  s3                                       
-13 \ Do step 2 if condition 1 is true, otherwise do step 3.         
-14   s1  c1  IF  s2  ELSE  s3  THEN  s4                             
-15                                                                  
- 
- 
-Screen 6 not modified      
- 0 \ REVIEW - 5    Interval Logic                 20:41JWB10/02/85  
- 1 \ (IN)  leaves a true flag if   a < x < b                        
- 2 : (IN)  ( x a b   flag )                                         
-          2DUP < NOT ABORT" Invalid interval."                    
-          -ROT OVER < -ROT > AND ;                                
-                                                                  
- 6 \ [IN]  leaves a true flag if a <= x <= b  , otherwise false.    
- 7 : [IN]  ( x a b   flag )                                         
-         1+ SWAP 1- SWAP (IN) ;                                   
- 9 \ (IN]  leaves a true flag if a <  x <= b  , otherwise false.    
-10 : (IN]  ( x a b   flag )                                         
-11         1+ (IN) ;                                                
-12                                                                  
-13 \ [IN)  leaves a true flag if a <= x <  b  , otherwise false.    
-14 : [IN)  ( x a b   flag )                                         
-15         SWAP 1- SWAP (IN) ;                                      
- 
- 
-Screen 7 not modified      
- 0 \ Support for bullet proof #IN                 05:31jwb10/07/85  
- 1 : BELL    ( --   -- )  7 EMIT -1 #OUT +! ;                       
- 2 : DIGIT?  ( n    flag )    \ Leave true flag if valid digit.     
-         DUP 47 > SWAP 58 < AND ;  \ ASCII 0 ASCII 9 [IN]         
- 4 : RUBOUT  ( --   -- )       \ Rub out most recent digit          
-         8 EMIT 32 EMIT 8 EMIT -4 #OUT +! ;                       
- 6 \ Remove digit from screen and number then dec digit count.      
- 7 : -DIGIT  ( cnt n    cnt-1 n/10 )                                
-         RUBOUT SWAP 1- SWAP 10 / ;                               
- 9 \ Increment digit count and add in digit.                        
-10 : +DIGIT  ( cnt n key   cnt+1 10n+key-48)                        
-11         SWAP 10 UM* 2 PICK 48 - 0 D+ 32767. 2OVER DU<            
-12         IF   10 UM/MOD NIP NIP BELL                              
-13         ELSE DROP SWAP EMIT SWAP 1+ SWAP THEN ;                  
-14 : RESET?   ( flg cnt n   ff cnt n )    Reset sign flag.        
-15       OVER 0= IF  ROT DROP FALSE -ROT THEN ;  -->                
- 
- 
-Screen 8 not modified      
- 0 \ Support for bullet proof #IN                 05:31jwb10/07/85  
- 1 \ Correct an error input.                                        
- 2 : CORRECT.IT ( flg cnt num key   flg cnt num )                   
-        DROP OVER  0<>         \ Is digit count non zero?         
-        IF   -DIGIT            \ Remove most recent digit.        
-        ELSE BELL THEN RESET? ; \ Beep and reset if count is 0.   
- 6 \ Process all other keystrokes.                                  
- 7 : PROCESS.IT ( flg cnt num key   flg cnt num )                   
-        DUP  DIGIT?            \ Check for digit.                 
-        IF   +DIGIT            \ Echo & convert digit, inc count  
-10        ELSE DROP BELL THEN ;  \ Invalid key or overflow.         
-11 \ Apply sign to number.                                          
-12 : APPLY-SIGN  ( flg cnt num key   num )                          
-13        DROP NIP SWAP          \ Drop key, nip cnt, get flg.      
-14        IF NEGATE THEN  ;      \ Apply sign to number.            
-15 : NEGATIVE? ASCII - =  3 PICK 0= AND ; --> \ Negative number?    
- 
- 
-Screen 9 not modified      
- 0 \ Bullet proof #IN                             21:08JWB10/02/85  
- 1 : SET-FLAG  ( flg cnt num key   flg cnt num )                    
-       EMIT ROT DROP TRUE -ROT   \ Set sign flag true.            
-       SWAP 1+ SWAP  ;           \ Increment digit count.         
- 4 : #IN   ( --   num )                    \ flg=sign flag          
-       FALSE 0 0    ( flg cnt num )      \ cnt=digit count        
-       BEGIN KEY    ( flg cnt num key )  \ num=# being formed     
-       DUP  NEGATIVE?               \ Negative number?            
-       IF   SET-FLAG                \ Set -VE  flag true.         
-       ELSE DUP CONTROL M =         \ Return entered?             
-10            IF APPLY-SIGN EXIT THEN \ Apply sign to number & exit 
-11            DUP CONTROL H =         \ Correct error input?        
-12            IF   CORRECT.IT         \ This does it.               
-13            ELSE PROCESS.IT  THEN   \ Process all other keys.     
-14       THEN AGAIN ;                                               
-15 : TEST BEGIN CR #IN 3 SPACES DUP . 0= UNTIL ;                    
- 
- 
-Screen 10 not modified      
- 0 \ Return Stack                                 14:14JWB10/06/85  
- 1 \ New Words:  >R  R>  and  R@  for accessing the return stack.   
- 2 \ These words are very dangerous!! Do NOT test or execute them   
- 3 \ interactively. They can only be used within colon definitions. 
- 4 \ Note:   D) indicates data stack,  R) indicates return stack.   
- 5 \ Transfer top data stack item to return stack.                  
- 6 \ >R  ( n   -- D) ( --   n R)                                    
- 7 \ Transfer top return stack item to data stack.                  
- 8 \ R>  ( --   n D) ( n   -- R)                                    
- 9 \ Copy top return stack item to data stack.                      
-10 \ R@  ( --   n D) ( n    R)                                    
-11                                                                  
-12 \ RULES:                                                         
-13 \ 1. Each use of >R must be balanced with a corresponding R>   
-14 \ 2. Do not use >R R> and R@ within DO ... LOOPs.  Loop control  
-15 \    info is kept on the return stack and could be destroyed.    
- 
- 
-Screen 11 not modified      
- 0 \ Example 1: Average, Problem 1                14:26JWB10/06/85  
-                                                                  
- 2 : AVERAGE  ( x1 x2 ... xn   avg )                                
-       DEPTH >R R@ 1- 0                                           
-         ?DO + LOOP                                               
-         CR ." The average of the " R@ . ." numbers is "          
-         R> / .  CR ;                                             
- 7 \ Problem 0:                                                     
- 8 \ Rewrite AVERAGE without using the return stack.                
- 9 \ Problem 1:                                                     
-10 \ Rewrite AVERAGE  so that it takes number pairs, class mark xi  
-11 \ and frequency fi .  ie average = [ sum xi*fi ]/n   n = sum fi  
-12                                                                  
-13 \ AVERAGE ( x1 f1 x2 f2 ... xk  fk    -- )                       
-14                                                                  
-15                                                                  
- 
- 
-Screen 12 not modified      
- 0 \ Problem 1 solution.  Histogram, Problem      14:22JWB10/06/85  
- 1 : AVERAGE  ( x1 f1 x2 f2 ... xn fn    -- )                       
-         0 0 DEPTH  2/ 1-  0                                      
-         ?DO  2 PICK + 2SWAP *                                    
-              ROT  +  SWAP                                        
-         LOOP CR ." The average of the "                          
-         DUP .   ." numbers is "  / . CR ;                        
- 7 \ Given n frequencies construct histogram or bar chart.          
- 8 : WHITE         177 EMIT ;                                       
- 9 : HISTOGRAM ( f1 f2 ... fn   -- )                                
-10         CR DEPTH 0                                               
-11         ?DO  CR DUP 0 ?DO WHITE LOOP  SPACE .  LOOP CR ;         
-12 \ Problem 2:                                                     
-13 \ Modify HISTOGRAM so that the bars come out in the proper order 
-14 \ ( f1 first). Hint: " ROLL "  the stack and display bar.  Clean 
-15 \ the stack when finished printing bars.                         
- 
- 
-Screen 13 not modified      
- 0 \ Example - 3 Square Root                      21:19JWB10/02/85  
- 1 \ Square root by Newton's Method.                                
- 2 \ Theory:  Let  f(x) = x^2 - n  where the root or zero of this   
- 3 \ function is the square root of n.                              
- 4 \ Newton's Method:   use guess xo to get better guess xn         
- 5 \ according to:   xn = xo - f(xo)/f'(xo)                         
- 6 \ It can be shown that:  xn = ( xo + n/xo )/2                    
-                                                                  
- 8 : XNEW  ( n xold   n xnew )                                      
-         2DUP  /  +  2/  ;                                        
-10 : SQRT  ( n    root )                                            
-11         DUP 0< ABORT" Illegal argument."                         
-12         DUP 1 >                                                  
-13         IF    DUP 2/  ( n  n/2 ) 10 0 DO XNEW LOOP NIP           
-14         THEN  ;                                                  
-15 \ Note:  This is not the best or fastest square root algorithm.  
- 
- 
-Screen 14 not modified      
- 0 \ Example 4 Hypotenuse, Problem 3 Area         21:21JWB10/02/85  
- 1 \ Hypotenuse of a right triangle.                                
- 2 : HYPO  ( a b   c )                                              
-         DUP * SWAP                                               
-         DUP * +                                                  
-         SQRT  ;                                                  
-                                                                  
- 7 : TEST  15 1 DO  15 1 DO                                         
-         CR I J 2DUP  4 .R 4 .R  HYPO 4 .R                        
-         LOOP KEY DROP CR LOOP ;                                  
-10                                                                  
-11 \ Problem 3: Write a word that calculates the area of a triangle 
-12 \ using HERO's formula.   A = sqrt[ s(s-a)(s-b)(s-c) ]           
-13 \ where  s is the semi perimeter.  s = (a+b+c)/                
-14                                                                  
-15                                                                  
- 
- 
-Screen 15 not modified      
- 0 \   Solution to problem 3.                     22:17JWB10/02/85  
-                                                                  
- 2 : AREA  ( a b c   area )                                         
-         3DUP + +  2/ >R       ( a b c  )                         
-         R@ 3 ROLL -           ( b c s-a )                        
-         R@ 3 ROLL -           ( c s-a s-b )                      
-         R@ 3 ROLL -           ( s-a s-b s-c )                    
-         * * R> *  SQRT                                           
-         CR  ." Triangle area is " . ;                            
-                                                                  
-10 \ Warning!  You cannot factor  the R@ 3 ROLL -   out of the      
-11 \ above definition.  All user access to the return stack must    
-12 \ occur within one word  as FORTH uses the return stack to nest  
-13 \ the calling  words return address.                             
-14                                                                  
-15 \ Can you give a solution that does not use the return stack?    
- 
- 
-Screen 16 not modified      
- 0 \ F83  Memory Map                              21:21JWB10/02/85  
-   F83  Occupies a 64K ( 65535 ) bytes of memory.  Each of these  
- 2 bytes of memory has its own unique 16 bit address.  Addresses    
- 3 range from 0 through 65535 decimal  but are best represented in  
- 4 hexadecimal ( base 16 ) as 0000 throught FFFF .                  
-                                                                  
- 6 HEX     ( --   -- )  Set system number BASE to 16 (decimal).     
- 7 DECIMAL ( --   -- )  Set system number BASE to 10 (decimal).     
-    ** Use the unsigned print operator to look at addresses.**    
- 9 LIMIT   ( --  adr )  Leave address of end of disk buffer area.   
-10 FIRST   ( --  adr )  Leave address of start of disk buffer area. 
-11 INIT-R0 ( --  adr )  Leave address of top of return stack.       
-12 TIB     ( --  adr )  Leave address of terminal input buffer.     
-13 PAD     ( --  adr )  Leave address of text output buffer.        
-14 HERE    ( --  adr )  Leave address of word buffer.               
-15 ORIGIN  ( --  adr )  Leave address of FORTH cold start.          
- 
- 
-Screen 17 not modified      
- 0 \ Memory Operators                             14:28JWB10/06/85  
-                                                                  
- 2 DUMP    ( adr n   -- ) Dump n bytes of memory starting at adr.   
- 3 ERASE   ( adr n   -- ) Erase n bytes of memory starting at adr   
-                        to zeros.                                 
- 5 FILL  ( adr n m   -- ) Fill n bytes of memory starting at adr    
-                        with low 8 bits of m ( 0 - 255 ).         
-                                                                  
-       ( n adr   -- ) Store 16b value n at address adr.         
-       ( adr      ) Fetch 16b value at adr and leave as n.    
-10 NOTE:  16 bit numbers are stored with the low byte at adr        
-11        and the high byte at adr+1 ( this is convention for       
-12        6502 and 8086 CPUs -  68000 is the reverse ).             
-13  C!     ( n adr   -- ) Store low 8 bits of n at address adr.     
-14  C@     ( adr      ) Fetch 8 bit value at adr and leave as n.  
-15  ?      ( adr     -- ) Display contents of cell at adr.          
- 
- 
-Screen 18 not modified      
- 0 \ Variables                                    21:21JWB10/02/85  
- 1 Values which change quite frequently and must be accessed by     
- 2 a number of words are best represented by the use of VARIABLEs.  
- 3 Values represented by variables have the added convenience of    
- 4 reference by name.                                               
-                                                                  
-   VARIABLE  <name>  ( --   -- )  Create 16bit data storage       
-                                  called <name>                 
-   <name>            ( --  adr )  Leave storage address of <name> 
-                                                                  
-10    VARIABLE  RAIN                                                
-11    2 RAIN !      RAIN ?                                          
-12                                                                  
-13 : DRIP  RAIN @ 1+ RAIN ! ;                                       
-14                                                                  
-15   DRIP  DRIP  DRIP     RAIN ?                                    
- 
- 
-Screen 19 not modified      
- 0 \ Constants                                    14:30JWB10/06/85  
- 1 \ Values which never change are best represented by CONSTANTs.   
- 2 \                                                                
- 3 \ CONSTANT <name>   ( n    -- )  Create a constant  <name> whose 
- 4 \                                value is  n.                    
- 5 \ <name>            ( --    n )  Leave value of <name> on stack. 
- 6 \ Examples:                                                      
-                                                                  
-    CONSTANT  D/W      \ Days per week.                         
-  52  CONSTANT  W/Y      \ Weeks per year.                        
-10  12  CONSTANT  M/Y      \ Months per year.                       
-11                                                                  
-12  31416 CONSTANT PI                                               
-13 : *PI  PI 10000 */ ;                                             
-14 : AREA  ( r    area )                                            
-15     DUP * *PI ;                                                  
- 
- 
-Screen 20 not modified      
- 0 \ Random Numbers  Problem 4 & 5                21:57JWB10/05/85  
-   VARIABLE SEED    1234  SEED  !                                 
- 2 : (RND) SEED @ 259 * 3 + 32767 AND DUP SEED ! ;                  
- 3 : RND  ( n   r )   \ r is a random number   0 <= r < n           
-         (RND) 32767 */ ;                                         
-                                                                  
- 6 : DICE  ( --   die1  die2 )                                      
-         6 RND 1+  6 RND 1+  ;                                    
- 8 \ Problem 4  Write the word CARD described below.                
- 9 \ CARD  draws one card from a deck. When CARD is executed it     
-10 \ will leave the suit as a number 1 - 4 and the face value as    
-11 \ 1 - 13.    CARD   ( --   suit  value )                         
-12                                                                  
-13 \ Problem 5                                                      
-14 \ Write words  SUIT  and VALUE  that use the result of CARD      
-15 \ to display  card picked  as   7 of Harts    K of Diamonds  etc 
- 
- 
-Screen 21 not modified      
- 0 \ Pythagorean Triples. Problem 6.              21:57JWB10/05/85  
-   VARIABLE A    VARIABLE B      VARIABLE C      VARIABLE N       
-   VARIABLE AA   VARIABLE BB     VARIABLE CC                      
- 3 : .ABC  ( --   -- )                                              
-         CR A @ 12 .R  B @ 12 .R  C @ 12 .R ;                     
- 5 : TRIPLES ( --   -- )                                            
-          25 1 DO   I A !  I DUP *  AA !                          
-                25 1 DO  I B ! I DUP *  BB !                      
-                      38 1 DO I C ! I DUP *  CC !                 
-                              AA @ BB @ + CC @ =                  
-10                              IF .ABC THEN                        
-11                     LOOP  LOOP                                   
-12   KEY?  ?LEAVE   ( any key escape )  LOOP ;                      
-13 \ Problem 6: Modify to find all triples upto 100.  Can you make  
-14 \ it run faster, using SQRT ? , without using variables?         
-15 \ Modify so that triples are counted.                            
- 
- 
-Screen 22 not modified      
- 0 \  More Memory Operators                       14:37JWB10/06/85  
- 1 Note:  cell = 2 bytes = 16 bits = 1 word                         
-   +!     ( n adr   -- )  Add n to the value found at address adr 
-   ON     ( adr     -- )  Set cell at adr to true or -1.          
-   OFF    ( adr     -- )  Set cell at addr to false or 0.         
-                                                                  
- 6 CREATE <name> ( --  -- ) Creates a dictionary entry named <name> 
-                         When executed, <name> leaves the address 
-  <name>       ( --  adr) of the first memory cell which follows  
-                          the word name.  No memory is allocated. 
-10 ALLOT         ( n   -- ) Allocate n bytes of memory in the       
-11                          dictionary.                             
-12   ,           ( n   -- ) Allocate 16 bits ( 2 bytes ) of memory  
-13                          initializing it to the value n.         
-14  C,           ( n   -- ) Allocate 8 bits ( 1 byte ) of memory    
-15                          initializing it to low 8 bits of n.     
- 
- 
-Screen 23 not modified      
- 0 \ Tables  -  arrays by another name.           23:06JWB10/05/85  
-                                                                  
-  CREATE MARBLE  0 , 0 , 0 , 0 , 0 , 0 ,                          
-                                                                  
-  0 CONSTANT RED         2 CONSTANT BLUE     4 CONSTANT YELLOW    
-  6 CONSTANT BLACK       8 CONSTANT WHITE   10 CONSTANT GREEN     
-                                                                  
- 7 : MARBLES                                                        
-         MARBLE + ;                                               
-                                                                  
-10 2 RED   MARBLES !    3 BLUE  MARBLES !     5 YELLOW MARBLES !    
-11 8 BLACK MARBLES !   13 WHITE MARBLES !    21 GREEN  MARBLES !    
-12                                                                  
-13                                                                  
-14                                                                  
-15                                                                  
- 
- 
-Screen 24 not modified      
- 0 \ Tables  -  arrays by another name.           20:39jwb10/06/85  
-  CREATE TABLE   0 , 0 , 0 , 0 , 0 , 0 ,                          
-  VARIABLE MODE                                                   
-  0 CONSTANT RED         2 CONSTANT BLUE     4 CONSTANT YELLOW    
-  6 CONSTANT BLACK       8 CONSTANT WHITE   10 CONSTANT GREEN     
- 5 : LESS -1  MODE !  ;    : LESS?  MODE @ -1 = ;                   
- 6 : SHOW  0  MODE !  ;    : SHOW?  MODE @  0=  ;                   
- 7 : MORE  1  MODE !  ;    : MORE?  MODE @  1 = ;                   
- 8 : ONLY  2  MODE !  ;      ONLY                                   
- 9 : MARBLES  ( {n} color   -- )                                    
-10         TABLE  +   DEPTH 1 = IF SHOW THEN                        
-11         LESS? IF   SWAP NEGATE SWAP +!                           
-12               ELSE SHOW? IF   @ .                                
-13                          ELSE MORE? IF   +!                      
-14                                     ELSE  !                      
-15       THEN  THEN  THEN   ONLY ;     : MARBLE  MARBLES ;          
- 
- 
-Screen 25 not modified      
- 0 \ Arrays   Problem 7.                          22:03JWB10/05/85  
-   CREATE  DATA   20 ALLOT                                        
- 2 : DATA@  ( i      )  2* DATA + @ ;                             
- 3 : DATA!  ( n i   -- )  2* DATA + ! ;                             
- 4 \ : CLEAR-DATA  10 0 DO 0 I DATA! LOOP ;                         
- 5 : CLEAR-DATA  DATA 20 ERASE ;                                    
- 6 : GET-DATA                                                       
-         10 0 DO CR I 3 .R SPACE #IN  I DATA! LOOP ;              
- 8 : SHOW-DATA                                                      
-         10 0 DO CR ." DATA( " I . ." ) ="  I DATA@ 10 .R LOOP ;  
-10 \ Problem 7:                                                     
-11 \ Write a word COUNT-DATA ( --   k )  that leaves the number of  
-12 \ non zero items k in the array DATA  on the stack.              
-13 \ Write SUM-DATA ( --  sum ) that sums the non zero data values. 
-14 \ Write AVERAGE-DATA ( --  -- ) prints average of non 0 values.  
-15 \ Be sure to test you words.                                     
- 
- 
-Screen 26 not modified      
- 0 \ User stacks.                                 22:51JWB10/05/85  
-   CREATE  P-STACK  20 ALLOT     VARIABLE P-INDEX                 
- 2 : P-CLEAR  ( -- -- D) ( ?? -- P) 0 P-INDEX ! P-STACK 20 ERASE ;  
- 3 : P-DEPTH  ( -- n  D) P-INDEX @ 2/ ;                             
- 4 : P-INC    ( -- -- D)                                            
-       P-INDEX @ 20 = IF ." P-OVERFLOW"  P-CLEAR                  
-                      ELSE 2 P-INDEX +! THEN ;                    
- 7 : P-DEC    ( -- -- D)                                            
-       P-INDEX @ 0= IF ." P-UNDERFLOW"                            
-                    ELSE -2 P-INDEX +! THEN ;                     
-10                                                                  
-11 : >P  ( n   -- D)  ( --   n P) P-INC P-INDEX @ P-STACK + ! ;     
-12 : P@  ( --   n D)  ( n    n P) P-INDEX @ P-STACK + @  ;          
-13 : P>  ( --   n D)  ( n   -- P) P@ P-DEC ;                        
-14 : .P  P-DEPTH ?DUP IF 1+ 1 ?DO I 2* P-STACK + @ 8 .R LOOP        
-15                    ELSE ." P-STACK EMPTY" THEN ;                 
- 
- 
-Screen 27 not modified      
- 0 \ Problem 8:  User stacks.                     12:42JWB10/06/85  
- 1 \ Write FORTH words for the following user stack operations.     
- 2 \ The should leave the data stack unchanged!!!                   
- 3 : PDUP                                                  ;        
- 4 : PDROP                                                 ;        
- 5 : PSWAP                                                 ;        
- 6 : POVER                                                 ;        
- 7 : PROT                                                  ;        
- 8 : -PROT                                                 ;        
- 9 : PTUCK                                                 ;        
-10 : PNIP                                                  ;        
-11 : 2PDUP                                                 ;        
-12 : 3PDUP                                                 ;        
-13 : 2PSWAP                                                ;        
-14 : 2PDROP                                                ;        
-15 : 2POVER                                                ;        
- 
- 
-Screen 28 not modified      
- 0 \  Double Variables and Constants.             23:13JWB10/05/85  
-                                                                  
- 2 2VARIABLE   <name>      Creates a 2 cell ( 4 byte ) variable     
-                         called <name>                          
- 4 <name>    ( --   adr )  When <name> is executed it will puse the 
-                         address of the first cell onto the stack 
-                                                                  
- 7 2CONSTANT   <name>      Creates a double constant called <name>  
-             ( d    -- ) with the initial value of d              
- 9 <name>      ( --    ) When <name> is executed the double       
-10                         number is pushed to the data stack.      
-11                                                                  
-12 2!      ( d  adr   -- ) Store the double number d at adr.        
-13                                                                  
-14 2@      ( adr      d  ) Fetch the double number d from adr.      
-15                                                                  
- 
- 
-Screen 29 not modified      
- 0 \ Hard copy screen documentation.              13:31JWB01/31/86  
-                                                                  
- 2 \ Print three screens starting with n on the printer.            
- 3 : HTRIAD  ( n   -- )                                             
-         PRINTING ON DUP 3 +  SWAP   27 EMIT 69 EMIT              
-         DO CR I LIST LOOP  PRINTING OFF ;                        
-                                                                  
- 7 \ Send a top of page command to printer.                         
- 8 : FFEED                                                          
-         PRINTING ON 12 EMIT PRINTING OFF ;                       
-10                                                                  
-11 \ Print screens  first through last  on printer, three per page. 
-12 : DOC   ( first last   -- )                                      
-13         1+ SWAP DO I HTRIAD FFEED 3 +LOOP ;                      
-14                                                                  
-15                                                                  
- 
- 
-Screen 30 not modified      
-                                                                  
-                                                                  
-                                                                  
-                                                                  
-                                                                  
-                                                                  
-                                                                  
-                                                                  
-                                                                  
-                                                                  
-10                                                                  
-11                                                                  
-12                                                                  
-13                                                                  
-14                                                                  
-15                                                                  
- 
- 
-Screen 31 not modified      
- 0 \ Polygon Area - 1                             05:07jwb10/07/85  
- 1 CREATE X  102 ALLOT     \ Array for x coordinates                
- 2 CREATE Y  102 ALLOT     \ Array for y coordinates                
- 3 VARIABLE  #POINTS       \ Number of points in polygon            
- 4 VARIABLE  SUM           \ Sum of the x(i)y(i-1) - x(i)y(i+1)     
- 5 \ Compute address of ith component.                              
- 6 : II     ( i adr  adr{i} )                                       
-          SWAP 1- #POINTS @ MOD 1+ 2* +  ;                        
- 8 \ Fetch ith x component.                                         
- 9 : X@  ( i     x{i} ) X II @ ;                                    
-10 \ Fetch ith y component.                                         
-11 : Y@  ( i     y{i} ) Y II @ ;                                    
-12 \ Store ith x component.                                         
-13 : X!  ( x i     -- ) X II ! ;                                    
-14 \ Store ith y component.                                         
-15 : Y!  ( y i     -- ) Y II ! ;                                    
- 
- 
-Screen 32 not modified      
- 0 \ Polygon area - 2                             21:11jwb10/06/85  
- 1 \ Move to the next tab stop.                                     
- 2 : TAB ( --  -- )                                                 
-          BEGIN  #OUT @ 8 MOD                                     
-                IF SPACE ELSE EXIT THEN                           
-         AGAIN ;                                                  
- 6 \ Get number from keyboard.                                      
- 7 : GET#  ( --   n )                                               
-          ASCII >  EMIT SPACE  #IN ;                              
- 9 \ Prompt and fetch number of data points.                        
-10 : GET_#POINTS  ( --   -- )                                       
-11         BEGIN                                                    
-12         CR ." Enter number of data points. "                     
-13         GET#  DUP 3 <                                            
-14         WHILE  CR ." You need at least 3 data points!"           
-15         REPEAT  50 MIN #POINTS ! ;                               
- 
- 
-Screen 33 not modified      
- 0 \ Polygon area - 3                             21:12jwb10/06/85  
- 1 \ Prompt and fetch all data points.                              
- 2 : GET_DATA      ( --   -- )                                      
-         CR CR ." Point " TAB ."   X" TAB ."   Y"                 
-         #POINTS @ 1+ 1                                           
-         DO   CR I 3 .R  TAB GET# I X!                            
-              TAB GET# I Y! LOOP ;                                
- 7 \ Sum data points.                                               
- 8 : SUM_DATA      ( --   -- )                                      
-         0 SUM !                                                  
-10         #POINTS @ 1+ 1                                           
-11         DO I X@ I 1- Y@ *    ( X{i}*Y{i-1} )                     
-12            I X@ I 1+ Y@ *    ( X{i}*Y{i+1} )                     
-13            - SUM +!                                              
-14         LOOP  ;                                                  
-15                                                                  
- 
- 
-Screen 34 not modified      
- 0 \ Polygon area - 4                             20:55jwb10/06/85  
- 1 \ Display computed area.                                         
- 2 : PUT_AREA      ( --  -- )                                       
-         SUM @ 2 /MOD                                             
-         CR ." AREA = " 6 .R  ASCII . EMIT                        
-         IF ASCII 5 EMIT ELSE ASCII 0 EMIT THEN SPACE ;           
-                                                                  
- 7 \ Compute area of polygon.                                       
- 8 : AREA_POLY     ( --   -- )                                      
-         GET_#POINTS                                              
-10         GET_DATA                                                 
-11         SUM_DATA                                                 
-12         PUT_AREA ;                                               
-13                                                                  
-14                                                                  
-15                                                                  
- 
-</code> 
papierkorb/sample4.blk.1755359401.txt.gz · Zuletzt geändert: 2025-08-16 17:50 von mka