内に含まその他のドキュメントサポート リソース | PDF 文書ファイルをダウンロードする (377 KB)
Chapter 4 Using Forth ToolsThis chapter introduces the Forth programming language as it is implemented in OpenBoot. Even if you are familiar with Forth, work through the examples shown in this chapter; they provide specific, OpenBoot-related information. The version of Forth contained in OpenBoot is based on ANS Forth. Appendix I, Forth Word Reference ," lists the complete set of available commands. Note - This chapter assumes that you know how to enter and leave the User Interface. At the ok prompt, if you type commands that hang the system and you cannot recover using a key sequence, you may need to perform a power cycle to return the system to normal operation. Forth CommandsForth has a very simple command structure. Forth commands, also called Forth words, consist of any combination of characters that can be printed. For example, letters, digits, or punctuation marks. Examples of legitimate words are shown below: @ dump . 0< + probe-scsi Forth words must be separated from one another by one or more spaces (blanks). Characters that are normally treated as "punctuation" in some other programming languages do not separate Forth words. In fact, many of those "punctuation" characters are Forth words! Pressing Return at the end of any command line executes the typed commands. (In all the examples shown, a Return at the end of the line is assumed.) A command line can have more than one word. Multiple words on a line are executed one at a time, from left to right, in the order in which they were typed. For example: ok testa testb testc ok ok testa ok testb ok testc ok In OpenBoot, uppercase and lowercase letters are equivalent in Forth word names. Therefore, testa, TESTA, and TesTa all invoke the same command. However, words are conventionally written in lowercase. Some commands generate large amounts of output (for example, dump or words). You can interrupt such a command by pressing any key except q. (If you press q, the output is aborted, not suspended.) Once a command is interrupted, output is suspended and the following message appears: More [<space>,<cr>,q] ? Press the space bar (<space>) to continue, press Return (<cr>) to output one more line and pause again, or type q to abort the command. When a command generates more than one page of output, the system automatically displays this prompt at the end of each page. Data TypesThe terms shown in Table 4-1 describe the data types used by Forth. Table 4-1 Forth Data Type Definitions
Using NumbersEnter a number by typing its value, for example, 55 or -123. Forth accepts only integers (whole numbers); it does not understand fractional values (e.g., 2/3). A period at the end of a number signifies a double number. Periods or commas embedded in a number are ignored, so 5.77 is understood as 577. By convention, such punctuation usually appears every four digits. Use one or more spaces to separate a number from a word or from another number. Unless otherwise specified, OpenBoot performs integer arithmetic on data items that are one cell in size, and creates results that are one cell in size. Although OpenBoot implementations are encouraged to use base 16 (hexadecimal) by default, they are not required to do so. Consequently, you must establish a specific number base if your code depends on a given base for proper operation. You can change the number base with the commands decimal and hex to cause all subsequent numeric input and output to be performed in base 10 or 16, respectively. For example, to operate in decimal, type: ok decimal ok To change to hexadecimal, type: ok hex ok To identify the current number base, you can use: ok 10 .d 16 ok The 16 on the display shows that you are operating in hexadecimal. If 10 showed on the display, it would mean that you are in decimal base. The .d command displays a number in base 10, regardless of the current number base. The StackThe Forth stack is a last-in, first-out buffer used for temporarily holding numeric information. Think of it as a stack of books: the last one you put on the top of the stack is the first one you take off. Understanding the stack is essential to using Forth. To put a number on the stack, simply type its value. ok 44 (The value 44 is now on top of the stack) ok 7 (The value 7 is now on top, with 44 just underneath) ok Displaying Stack ContentsThe contents of the stack are normally invisible. However, properly visualizing the current stack contents is important for achieving the desired result. To show the stack contents with every ok prompt, type: ok showstack 44 7 ok 8 44 7 8ok noshowstack ok The topmost stack item is always shown as the last item in the list, immediately before the ok prompt. In the above example, the topmost stack item is 8. If showstack has been previously executed, noshowstack will remove the stack display prior to each prompt. Note - In some of the examples in this chapter, showstack is enabled. In those examples, each ok prompt is immediately preceded by a display of the current contents of the stack. The examples work the same if showstack is not enabled, except that the stack contents are not displayed. Nearly all words that require numeric parameters fetch those parameters from the top of the stack. Any values returned are generally left on top of the stack, where they can be viewed or consumed by another command. For example, the Forth word + removes two numbers from the stack, adds them together, and leaves the result on the stack. In the example below, all arithmetic is in hexadecimal. 44 7 8 ok + 44 f ok + 53 ok Once the two values are added together, the result is put onto the top of the stack. The Forth word . removes the top stack item and displays that value on the screen. For example: 53 ok 12 53 12 ok . 12 53 ok . 53 ok (The stack is now empty) ok 3 5 + . 8 ok (The stack is now empty) ok . Stack Underflow ok The Stack DiagramTo aid understanding, conventional coding style requires that a stack diagram of the form ( -- ) appear on the first line of every definition of a Forth word. The stack diagram specifies what the execution of the word does to the stack. Entries to the left of -- represent those stack items that the word removes from the stack and uses during its operation. The right-most of these items is on top of the stack, with any preceding items beneath it. In other words, arguments are pushed onto the stack in left to right order, leaving the most recent one (the right-most one in the diagram) on the top. Entries to the right of -- represent those stack items that the word leaves on the stack after it finishes execution. Again, the right-most item is on top of the stack, with any preceding items beneath it. For example, a stack diagram for the word + is: ( nu1 nu2 -- sum ) Therefore, + removes two numbers (nu1 and nu2) from the stack and leaves their sum (sum) on the stack. As a second example, a stack diagram for the word. is: ( nu -- ) The word . removes the number on the top of the stack (nu) and displays it. Words that have no effect on the contents of the stack (such as showstack or decimal), have a ( -- ) stack diagram. Occasionally, a word will require another word or other text immediately following it on the command line. The word see, used in the form: see thisword is such an example. Stack items are generally written using descriptive names to help clarify correct usage. See Table 4-2 for stack item abbreviations used in this manual. Table 4-2 Stack Item Notation
Manipulating the StackStack manipulation commands (described in Table 4-3) allow you to add, delete, and reorder items on the stack. Table 4-3 Stack Manipulation Commands
A typical use of stack manipulation might be to display the top stack item while preserving all stack items, as shown in this example: 5 77 ok dup (Duplicates the top item on the stack) 5 77 77 ok . (Removes and displays the top stack item) 77 5 77 ok Creating Custom DefinitionsForth provides an easy way to create new command words from sequences of existing words. Table 4-4 shows the Forth words used to create such new words. Table 4-4 Colon Definition Words
This kind of word is called a colon definition, named after the word that is used to create them. For example, suppose you want to create a new word, add4, that will add any four numbers together and display the result. You could create the definition as follows: ok : add4 + + + . ; ok The ; (semicolon) marks the end of the definition that defines add4 to have the behavior (+ + + .). The three addition operators (+) reduce the four stack items to a single sum on the stack; then . removes and displays that result. An example follows. ok 1 2 3 3 + + + . 9 ok 1 2 3 3 add4 9 ok Definitions are forgotten if a machine reset takes place. To keep useful definitions, put them into the script or save them in a text file on a host system. This text file can then be loaded as needed. (See Chapter 5, Loading and Executing Programs for more information on loading files.) When you type a definition from the User Interface, the ok prompt becomes a ] (right square bracket) prompt after you type the : (colon) and before you type the ; (semicolon). For example, you could type the definition for add4 like this: ok : add4 ] + + + ] . ] ; ok The above use of ] while inside a multi-line definition is a characteristic of Sun's implementation.
Or you could define it as follows: : add4 ( n1 n2 n3 n4 -- ) + + + ( sum ) . ( ) ; Note - The "(" is a Forth word meaning ignore the text up to the ")". Like any other Forth word, the "(" must have one or more spaces after it. Using Arithmetic FunctionsSingle-Precision Integer ArithmeticThe commands listed in Table 4-5 perform single-precision arithmetic. Table 4-5 Single-Precision Arithmetic Functions
Double Number ArithmeticThe commands listed in Table 4-6 perform double number arithmetic. Table 4-6 Double Number Arithmetic Functions
Data Type ConversionThe commands listed in Table 4-7 perform data type conversion. Table 4-7 32-Bit Data Type Conversion Functions
The data type conversion commands listed in Table 4-8 are available only on 64-bit OpenBoot implementations. Table 4-8 64-Bit Data Type Conversion Functions
Address ArithmeticThe commands listed in Table 4-9 perform address arithmetic. Table 4-9 Address Arithmetic Functions
The address arithmetic commands listed in Table 4-10 are available only on 64-bit OpenBoot implementations. Table 4-10 64-Bit Address Arithmetic Functions
Accessing MemoryVirtual MemoryThe User Interface provides interactive commands for examining and setting memory. With it, you can:
Memory operators let you read from and write to any memory location. All memory addresses shown in the examples that follow are virtual addresses. A variety of 8-bit, 16-bit, and 32-bit (and in some systems, 64-bit) operations are provided. In general, a c (character) prefix indicates an 8-bit (one byte) operation; a w (word) prefix indicates a 16-bit (doublet) operation; an l (longword) prefix indicates a 32-bit (quadlet) operation; and an x prefix indicates a 64-bit (octlet) operation. waddr, qaddr, and oaddr indicate addresses with alignment restrictions. For example, qaddr indicates 32-bit (4 byte) alignment; on many systems such an address must be a multiple of 4, as shown in the following example: ok 4028 l@ ok 4029 l@ Memory address not aligned ok Forth, as implemented in OpenBoot, adheres closely to the ANS Forth Standard. If you explicitly want a 16-bit fetch, a 32-bit fetch or (on some systems) a 64-bit fetch, use w@, l@ or x@ instead of @. Other memory and device register access commands also follow this convention. Table 4-11 lists commands used to access memory. Table 4-11 Memory Access Commands
The memory access commands listed in Table 4-12 are available only on 64-bit OpenBoot implementations. Table 4-12 64-Bit Memory Access Functions
The dump command is particularly useful. It displays a region of memory as both bytes and ASCII values. The example below displays the contents of 20 bytes of memory starting at virtual address 10000. ok 10000 20 dump
(Display 20 bytes of memory starting at virtual address
10000)
\/ 1 2 3 4 5 6 7 8 9 a b c d e f v123456789abcdef
10000 05 75 6e 74 69 6c 00 40 4e d4 00 00 da 18 00 00 .until.@NT..Z...
10010 ce da 00 00 f4 f4 00 00 fe dc 00 00 d3 0c 00 00 NZ..tt..~\..S...
ok
Some implementations support variants of dump that display memory as 16-, 32- and 64-bit values. You can use sifting dump (see "Searching the Dictionary") to find out if your system has such variants. If you try to access an invalid memory location (with @, for example), the operation may abort and display an error message, such as Data Access Exception or Bus Error. Table 4-13 lists memory mapping commands. Table 4-13 Memory Mapping Commands
The following screen is an example of the use of alloc-mem and free-mem.
Device RegistersDevice registers cannot be reliably accessed using the virtual memory access operators discussed in the last section. There are special operators for accessing device registers, and these operators require that the machine be properly set up prior to their use. For a detailed explanation of this topic, see Writing FCode 3.x Programs. Using Defining WordsThe dictionary contains all the available Forth words. Forth defining words create new Forth words. Defining words require two stack diagrams. The first diagram shows the stack effect when the new word is created. The second (or "Execution:") diagram shows the stack effect when that word is later executed. Table 4-14 lists the defining words that you can use to create new Forth words. If a Forth command is created with the same name as an existing command, the new command will be created normally. Depending on the implementation, a warning message "new-name isn't unique" may be displayed. Previous uses of that command name will be unaffected. Subsequent uses of that command name will use the latest definition of that command name. (To correct the original definition such that all uses of the command name get the corrected behavior, make the correction with patch. (See "Using patch and (patch)") Table 4-14 Defining Words
value lets you create a name for a numerical value that can be changed. Later execution of that name leaves the assigned value on the stack. The following example creates a word named foo with an initial value of 22, and then calls foo to use its value in an arithmetic operation. ok 22 value foo ok foo 3 + . 25 ok The value can be changed with the word to. For example: ok 43 value thisval ok thisval . 43 ok 10 to thisval ok thisval . 10 ok Words created with value are convenient, because you do not have to use @ to retrieve their values. The defining word variable creates a name with an associated one-cell memory location. Later execution of that name leaves the address of the memory on the stack. @ and ! are used to read or write to that address. For example: ok variable bar ok 33 bar ! ok bar @ 2 + . 35 ok The defining word defer creates a word whose behavior can be changed later, by creating a slot which can be loaded with different behaviors at different times. For example: ok hex ok defer printit ok ['] .d to printit ok ff printit 255 ok : myprint ( n -- ) ." It is " .h ] ." in hex " ; ok ['] myprint to printit ok ff printit It is ff in hex ok Searching the DictionaryThe dictionary contains all the available Forth words. Table 4-15 lists some useful tools you can use to search the dictionary. Please note that some of these tools work only with methods or commands while others work with all types of words (including, for example, variables and values). Table 4-15 Dictionary Searching Commands
Before you can understand the operation of the dictionary searching tools, you need to understand how words become visible. If there is an active package at the time a word is defined, the new word becomes a method of the active package, and is visible only when that package is the active package. The commands dev and find-device can be used to select or change the active package. The command device-end deselects the currently active package leaving no active package. If there is no active package at the time a word is defined, the word is globally visible (i.e. not specific to a particular package and always available). The dictionary searching commands first search through the words of the active package, if there is one, and then through the globally visible words. Note - The Forth commands only and also will affect which words are visible. .calls can be used to locate all of the Forth commands that use a specified word in their definition. .calls takes an execution token from the stack and searches the entire dictionary to produce a listing of the names and addresses of every Forth command which uses that execution token. For example: ok ' input .calls Called from input at 1e248d8 Called from io at 1e24ac0 Called from install-console at 1e33598 Called from install-console at 1e33678 ok see, used in the form: see thisword displays a "pretty-printed" listing of the source for thisword (without the comments, of course). For example: ok see see : see ¢ [¢] (see) catch if drop then ; ok For more details on the use of see, refer to "Using the Forth Language Decompiler". sifting takes a string from the input stream and searches vocabularies in the dictionary search order to find every command name that contains the specified string as shown in the following screen. ok sifting input In vocabulary options (1e333f8) input-device In vocabulary forth (1e2476c) input (1e0a9b4) set-input (1e0a978) restore-input (1e0a940) save-input (1e0a7f0) more-input? (1e086cc) input-file ok words displays all the visible word names in the dictionary, starting with the most recent definition. If a node is currently selected (as with dev), the list produced by words is limited to the words in that selected node. Compiling Data Into the DictionaryThe commands listed in Table 4-16 control the compilation of data into the dictionary. Table 4-16 Dictionary Compilation Commands
The dictionary compilation commands listed in Table 4-17 are available only on 64-bit OpenBoot implementations. Table 4-17 64-Bit Dictionary Compilation Commands
Displaying NumbersBasic commands to display stack values are shown in Table 4-18. Table 4-18 Basic Number Display
The .s command displays the entire stack contents without disturbing them. It can usually be used safely for debugging purposes. (This is the function that showstack performs automatically.) Changing the Number BaseYou can print numbers in a specific number base or change the operating number base using the commands in Table 4-19. Table 4-19 Changing the Number Base
The d# and h# commands are useful when you want to input a number in a specific base without explicitly changing the current base. For example: ok decimal (Changes base to decimal) ok 4 h# ff 17 2 4 255 17 2 ok The .d and .h commands act like "." but display the value in decimal or hexadecimal, respectively, regardless of the current base setting. For example: ok hex ok ff . ff .d ff 255 Controlling Text Input and OutputThis section describes text and character input and output commands. Table 4-20 lists commands to control text input. Table 4-20 Controlling Text Input
Comments are used with Forth source code (generally in a text file) to describe the function of the code. The ( (open parenthesis) is the Forth word that begins a comment. Any character up to the closing parenthesis ) is ignored by the Forth interpreter. Stack diagrams are one example of comments using (. Note - Remember to follow the( with a space, so that it is recognized as a Forth word. \ (backslash) indicates a comment terminated by the end of the line of text. key waits for a key to be pressed, then returns the ASCII value of that key on the stack. ascii, used in the form ascii x, returns on the stack the numerical code of the character x. key? looks at the keyboard to see whether the user has recently typed any key. It returns a flag on the stack: true if a key has been pressed and false otherwise. See "Conditional Flags" for a discussion on the use of flags. Table 4-21 lists general-purpose text display commands. Table 4-21 Displaying Text Output
cr sends a carriage-return/linefeed sequence to the console output device. For example: ok 3 . 44 . cr 5 . 3 44 5 ok emit displays the letter whose ASCII value is on the stack. ok ascii a 61 ok 42 61 42 ok emit emit Ba ok Table 4-22 shows commands used to manipulate text strings. Table 4-22 Manipulating Text Strings
Some string commands specify an address (the location in memory where the characters reside) and a length (the number of characters in the string). Other commands use a packed string or pstr, which is a location in memory containing a byte for the length, immediately followed by the characters. The stack diagram for the command indicates which form is used. For example, count converts a packed string to an address-length string. The command ." is used in the form: ." string". It outputs text immediately when it is encountered by the interpreter. A " (double quotation mark) marks the end of the text string. For example: ok : testing 34 . ." This is a test" 55 . ; ok ok testing 34 This is a test55 ok When " is used outside a colon definition, only two interpreted strings of up to 80 characters each can be assembled concurrently. This limitation does not apply in colon definitions. Redirecting Input and OutputNormally, OpenBoot uses a keyboard for command input, and a frame buffer with a connected display screen for display output. (Server systems may use an ASCII terminal connected to a serial port. For more information on how to connect a terminal to your system, see your system's installation manual.) You can redirect the input, the output, or both, to a serial port. This may be useful, for example, when debugging a frame buffer. Table 4-23 lists commands you can use to redirect input and output. Table 4-23 I/O Redirection Commands
The commands input and output temporarily change the current devices for input and output. The change takes place as soon as you enter a command; you do not have to reset your system. A system reset or power cycle causes the input and output devices to revert to the default settings specified in the NVRAM configuration variables input-device and output-device. These variables can be modified, if needed (see Chapter 3, Setting Configuration Variables). input must be preceded by one of the following: keyboard, ttya, ttyb, or device-specifier text string. For example, if input is currently accepted from the keyboard, and you want to make a change so that input is accepted from a terminal connected to the serial port ttya, type: ok ttya input ok At this point, the keyboard becomes nonfunctional (except perhaps for Stop-A), but any text entered from the terminal connected to ttya is processed as input. All commands are executed as usual. To resume using the keyboard as the input device, use the terminal keyboard to type: ok keyboard input ok Similarly, output must be preceded by one of the following: screen, ttya, or ttyb or device-specifier. For example, if you want to send output to a serial port instead of the normal display screen, type: ok ttya output ok The screen does not show the answering ok prompt, but the terminal connected to the serial port shows the ok prompt and all further output as well. io is used in the same way, except that it changes both the input and output to the specified place. For example: ok ttya io ok Generally, the argument to input, output, and io is a device-specifier, which can be either a device path name or a device alias. The device must be specified as a Forth string, using double quotation marks ("), as shown in the two examples below: ok " /sbus/cgsix" output ok " screen" output In the preceding examples, keyboard, screen, ttya, and ttyb are predefined Forth words that put their corresponding device alias string on the stack. Command Line EditorOpenBoot implements a command line editor (similar to EMACS, a common text editor), some optional extensions and an optional history mechanism for the User Interface. You use these tools to re-execute previous commands without retyping them, to edit the current command line to fix typing errors, or to recall and change previous commands. Table 4-24 lists line-editing commands available at the ok prompt. Table 4-24 Required Command Line Editor Keystroke Commands
The command line history extension saves previously-typed commands in an EMACS-like command history ring that contains at least 8 entries. Commands may be recalled by moving either forward or backward around the ring. Once recalled, a command may be edited and/or resubmitted (by typing the Return key). The command line history extension keys are: Table 4-25 Command Line History Keystroke Commands
The command completion extension enables the system to complete long Forth word names by searching the dictionary for one or more matches based on the already-typed portion of a word. When you type a portion of a word followed by the command completion keystroke, Control-Space, the system behaves as follows:
The command completion extension keys are: Table 4-26 Command Completion Keystroke Commands
Conditional FlagsForth conditionals use flags to indicate true/false values. A flag can be generated in several ways, based on testing criteria. The flag can then be displayed from the stack with the word ".", or it can be used as input to a conditional control command. Control commands can cause one behavior if a flag is true and another behavior if the flag is false. Thus, execution can be altered based on the result of a test. A 0 value indicates that the flag value is false. A -1 or any other nonzero number indicates that the flag value is true. Table 4-27 lists commands that perform relational tests, and leave a true or false flag result on the stack. Table 4-27 Comparison Commands
> takes two numbers from the stack, and returns true (-1) on the stack if the first number was greater than the second number, or returns false (0) otherwise. An example follows: ok 3 6 > . 0 (3 is not greater than 6) ok 0= takes one item from the stack, and returns true if that item was 0 or returns false otherwise. This word inverts any flag to its opposite value. Control CommandsThe following sections describe words used in a Forth program to control the flow of execution. The if-else-then StructureThe commands if, else and then provide a simple control structure. The commands listed in Table 4-28 control the flow of conditional execution. Table 4-28 ifelsethen Commands
The format for using these commands is: flag if (do this if true) then (continue normally) flag if (do this if true) else (do this if false) then (continue normally) The if command consumes a flag from the stack. If the flag is true (nonzero), the commands following the if are performed. Otherwise, the commands (if any) following the else are performed. ok : testit ( n -- ) ] 5 > if ." good enough " ] else ." too small " ] then ] ." Done. " ; ok ok 8 testit good enough Done. ok 2 testit too small Done. ok Note - The ] prompt reminds you that you are part way through creating a new colon definition. It reverts to ok after you finish the definition with a semicolon. The case StatementA high-level case command is provided for selecting alternatives with multiple possibilities. This command is easier to read than deeply-nested ifthen commands. Table 4-29 lists the conditional case commands. Table 4-29 case Statement Commands
Here is a simple example of a case command: ok : testit ( testvalue -- ) ] case ] 0 of ." It was zero " endof ] 1 of ." It was one " endof ] ff of ." Correct " endof ] -2 of ." It was minus-two " endof ] ( default ) ." It was this value: " dup . ] endcase ." All done." ; ok ok 1 testit It was one All done. ok ff testit Correct All done. ok 4 testit It was this value: 4 All done. ok Note - The (optional) default clause can use the test value which is still on the stack, but should not remove it (use the phrase "dup ." instead of "."). A successful of clause automatically removes the test value from the stack. The begin LoopA begin loop executes the same commands repeatedly until a certain condition is satisfied. Such a loop is also called a conditional loop. Table 4-30 lists commands to control the execution of conditional loops. Table 4-30 begin (Conditional) Loop Commands
begin any commandsflag until begin any commands flag while more commands repeat In both cases, the commands in the loop are executed repeatedly until the proper flag value causes the loop to be terminated. Then execution continues normally with the command following the closing command word (until or repeat). In the beginuntil case, until removes a flag from the top of the stack and inspects it. If the flag is false, execution continues just after the begin, and the loop repeats. If the flag is true, the loop is exited. In the beginwhilerepeat case, while removes a flag from the top of the stack and inspects it. If the flag is true, the loop continues by executing the commands just after the while. The repeat command automatically sends control back to begin to continue the loop. If the flag is false when while is encountered, the loop is exited immediately; control goes to the first command after the closing repeat. An easy mnemonic for either of these loops is: If true, fall through. ok begin 4000 c@ . key? until ( repeat until any key is pressed) 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 ok The loop starts by fetching a byte from location 4000 and displaying the value. Then, the key? command is called, which leaves a true on the stack if the user has pressed any key, and false otherwise. This flag is consumed by until and, if the value is false, then the loop continues. Once a key is pressed, the next call to key? returns true, and the loop terminates. Unlike many versions of Forth, the User Interface allows the interactive use of loops and conditionals -- that is, without first creating a definition. The do LoopA do loop (also called a counted loop) is used when the number of iterations of the loop can be calculated in advance. A do loop normally exits just before the specified ending value is reached. Table 4-31 lists commands to control the execution of counted loops. Table 4-31 do (Counted) Loop Commands
The following screen shows several examples of how loops are used. ok 10 5 do i . loop 5 6 7 8 9 a b c d e f ok ok 2000 1000 do i . i c@ . cr i c@ ff = if leave then 4 +loop 1000 23 1004 0 1008 fe 100c 0 1010 78 1014 ff ok : scan ( byte -- ) ] 6000 5000 (Scan memory 5000 - 6000 for bytes not equal to the specified byte) ] do dup i c@ <> ( byte error? ) ] if i . then ( byte ) ] loop ] drop ( the original byte was still on the stack, discard it ) ] ; ok 55 scan 5005 5224 5f99 ok 6000 5000 do i i c! loop (Fill a region of memory with a stepped pattern) ok ok 500 value testloc ok : test16 ( -- ) 1.0000 0 ( do 0-ffff ) (Write different 16-bit values to a location) ] do i testloc w! testloc w@ i <> ( error? ) (Also check the location) ] if ." Error - wrote " i . ." read " testloc w@ . cr ] leave ( exit after first error found ) (This line is optional) ] then ] loop ] ; ok test16 ok 6000 to testloc ok test16 Error - wrote 200 read 300 ok Additional Control CommandsTable 4-32 contains descriptions of additional program execution control commands. Table 4-32 Program Execution Control Commands
abort causes immediate termination and returns control to the keyboard. abort" is similar to abort but is different in two respects. abort" removes a flag from the stack and only aborts if the flag is true. Also, abort" prints any desired message when the abort takes place. eval takes a string from the stack (specified as an address and a length). The characters in that string are then interpreted as if they were entered from the keyboard. If a Forth text file has been loaded into memory (see Chapter 5, Loading and Executing Programs), then eval can be used to compile the definitions contained in the file. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||