- •Contents
- •List of Figures
- •List of Tables
- •Welcome!
- •About the Forth Programming Language
- •About This Book
- •How to Use This Book
- •Reference Materials
- •How to Proceed
- •1. Introduction
- •1.1.1 Definitions of Terms
- •1.1.2 Dictionary
- •1.1.3 Data Stack
- •1.1.4 Return Stack
- •1.1.5 Text Interpreter
- •1.1.6 Numeric Input
- •1.1.7 Two-stack Virtual Machine
- •1.2 Forth Operating System Features
- •1.3 The Forth Assembler
- •1.3.1 Notational Differences
- •1.3.1.1 Instruction Mnemonics
- •1.3.1.2 Addressing Modes
- •1.3.1.3 Instruction Format
- •1.3.1.4 Labels, Branches, and Structures
- •1.3.2 Procedural Differences
- •1.3.2.1 Resident Assembler
- •1.3.2.2 Immediately Executable Code
- •1.3.2.3 Relationship to Other Routines
- •1.3.2.4 Register Usage
- •1.4 Documentation and Programmer Aids
- •1.4.1 Comments
- •1.4.2 Locating Command Source
- •1.4.3 Cross-references
- •1.4.4 Decompiler and Disassembler
- •1.5 Interactive Programming—An Example
- •2. Forth Fundamentals
- •2.1 Stack Operations
- •2.1.1 Stack Notation
- •2.1.2 Data Stack Manipulation Operations
- •2.1.3 Memory Stack Operations
- •2.1.4 Return Stack Manipulation Operations
- •2.1.5 Programmer Conveniences
- •2.2 Arithmetic and Logical Operations
- •2.2.1 Arithmetic and Shift Operators
- •Single-Precision Operations
- •Double-precision Operations
- •Mixed-precision Operations
- •2.2.2 Logical and Relational Operations
- •Single-Precision Logical Operations
- •Double-Precision Logical Operations
- •2.2.3 Comparison and Testing Operations
- •2.3 Character and String Operations
- •2.3.1 The PAD—Scratch Storage for Strings
- •2.3.2 Single-Character Reference Words
- •2.3.3 String Management Operations
- •2.3.4 Comparing Character Strings
- •2.4 Numeric Output Words
- •2.4.1 Standard Numeric Output Words
- •2.4.2 Pictured Number Conversion
- •2.4.2.1 Using Pictured Numeric Output Words
- •2.4.2.2 Using Pictured Fill Characters
- •2.4.2.3 Processing Special Characters
- •2.5 Program Structures
- •2.5.1 Indefinite Loops
- •2.5.2 Counting (Finite) Loops
- •2.5.3 Conditionals
- •2.5.4 CASE Statement
- •2.5.5 Un-nesting Definitions
- •2.5.6 Vectored Execution
- •2.6 Exception Handling
- •3. System Functions
- •3.1 Vectored Routines
- •3.2 System Environment
- •3.3 Serial I/O
- •3.3.1 Terminal Input
- •3.3.2 Terminal Output
- •3.3.3 Support of Special Terminal Features
- •3.4 Block-Based Disk Access
- •3.4.1 Overview
- •3.4.2 Block-Management Fundamentals
- •3.4.3 Loading Forth Source Blocks
- •3.4.3.1 The LOAD Operation
- •3.4.3.2 Named Program Blocks
- •3.4.3.3 Block-based Programmer Aids and Utilities
- •3.5 File-Based Disk Access
- •3.5.1 Overview
- •3.5.2 Global File Operations
- •3.5.3 File Reading and Writing
- •3.5.4 File Support Words
- •3.6 Time and Timing Functions
- •3.7 Dynamic Memory Management
- •3.8 Floating Point
- •3.8.1 Floating-Point System Guidelines
- •3.8.2 Input Number Conversion
- •3.8.3 Output Formats
- •3.8.4 Floating-Point Constants, Variables, and Literals
- •3.8.5 Memory Access
- •3.8.6 Floating-Point Stack Operators
- •3.8.7 Floating-Point Arithmetic
- •3.8.8 Floating-Point Conditionals
- •3.8.9 Logarithmic and Trigonometric Functions
- •3.8.10 Address Management
- •3.8.11 Custom I/O
- •4. The Forth Interpreter and Compiler
- •4.1 The Text Interpreter
- •4.1.1 Input Sources
- •4.1.2 Source Selection and Parsing
- •4.1.3 Dictionary Searches
- •4.1.4 Input Number Conversion
- •4.1.5 Character String Processing
- •4.1.5.1 Scanning Characters to a Delimiter
- •4.1.5.2 Compiling and Interpreting Strings
- •4.1.6 Text Interpreter Directives
- •4.2 Defining Words
- •4.2.1 Creating a Dictionary Entry
- •4.2.2 Variables
- •4.2.3 CONSTANTs and VALUEs
- •4.2.4 Colon Definitions
- •4.2.5 Code Definitions
- •4.2.6 Custom Defining Words
- •4.2.6.1 Basic Principles of Defining Words
- •4.2.6.2 High-level Defining Words
- •4.3 Compiling Words and Literals
- •4.3.1 ALLOTing Space in the Dictionary
- •4.3.2 Use of , and C, to Compile Values
- •4.3.3 The Forth Compiler
- •4.3.4 Use of Literals and Constants in : Definitions
- •4.3.5 Explicit Literals
- •4.3.6 Use of ['] to Compile Literal Addresses
- •4.3.7 Compiling Strings
- •4.4 Compiler Directives
- •4.4.1 Making Compiler Directives
- •4.5 Overlays
- •4.6 Word Lists
- •4.6.1 Basic Principles
- •4.6.2 Managing Word Lists
- •4.6.3 Sealed Word Lists
- •5. The Assembler
- •5.1 Code Definitions
- •5.2 Code Endings
- •5.3 Assembler Instructions
- •5.4 Notational Conventions
- •5.5 Use of the Stack in Code
- •5.6 Addressing Modes
- •5.7 Macros
- •5.8 Program Structures
- •5.9 Literals
- •5.10 Device Handlers
- •5.11 Interrupts
- •5.12 Example
- •6.1 Guidelines for BLOCK-based source
- •6.1.1 Stack Effects
- •6.1.2 General Comments
- •6.1.3 Spacing Within Source
- •6.2.1 Typographic Conventions
- •6.2.2 Use of Spaces
- •6.2.3 Conditional Structures
- •6.2.4 do…loop Structures
- •6.2.5 begin…while…repeat Structures
- •6.2.6 begin…until…again Structures
- •6.2.7 Block Comments
- •6.2.8 Stack Comments
- •6.2.9 Return Stack Comments
- •6.2.10 Numbers
- •6.3 Wong’s Rules for Readable Forth
- •6.3.1 Example: Magic Numbers
- •6.3.2 Example: Factoring
- •6.3.3 Example: Simplicity
- •6.3.4 Example: Testing Assumptions
- •6.3.5 Example: IF Avoidance
- •6.3.6 Example: Stack Music
- •6.3.7 Summary
- •6.4 Naming Conventions
- •Appendix A: Bibliography
- •Appendix B: Glossary & Notation
- •B.1 Abbreviations
- •B.2 Glossary
- •B.3 Data Types in Stack Notation
- •B.4 Flags and IOR Codes
- •B.5 Forth Glossary Notation
- •Appendix C: Index to Forth Words
- •General Index
|
|
|
Forth Programmer’s Handbook |
|
|
|
|
Glossary |
|
|
|
AHEAD |
( — orig ) |
Tools Ext |
|
|
|
At compile time, begin an unconditional forward branch by placing orig on the |
|
|
|
control-flow stack. The behavior is incomplete until the orig is resolved, e.g., |
|
|
|
by THEN. At run time, resume execution at the location provided by the reso- |
|
|
|
lution of this orig. |
|
CS-PICK |
( i*x u — i*x xu ) |
Tools Ext |
|
|
|
Place a copy of the uth control-stack entry on the top of the control stack. The |
|
|
|
zeroth item is on top of the control stack; i.e., 0 CS-PICK is equivalent to DUP |
|
|
|
and 1 CS-PICK is equivalent to OVER. “C-S-pick” |
|
CS-ROLL |
( i*x u — (i-1)*x xu ) |
Tools Ext |
|
|
|
Move the nth control-stack entry to the top of the stack, pushing down all the |
|
|
|
control-stack entries in between. The zeroth item is on top of the stack; i.e., 0 |
|
|
|
CS-ROLL does nothing, 1 CS-ROLL is equivalent to SWAP, and 2 CS-ROLL is |
|
|
|
equivalent to ROT. “C-S-roll” |
|
|
|
Indefinite loops, Section 2.5.1 |
|
References |
|
||
|
|
DO … LOOPs, Section 2.5.2 |
|
|
|
IF … ELSE … THEN, Section 2.5.3 |
|
4.5 OVERLAYS
Because of Forth’s compilation speed, there is rarely need for a dynamic runtime overlay capability. Many resident applications have several functionally independent subsets, however, and it is conventional to organize these as mutually exclusive overlays, any one of which may be loaded into each terminal’s private dictionary. This is done by explicit command. Once loaded, such an overlay will remain resident until replaced by another.
Examples of such overlay categories in a business environment might include order entry, payroll, and general ledger. In a scientific laboratory system, there may be several different data acquisition and analysis modes.
Overlays are enabled with MARKER. The phrase MARKER <name> creates a dictionary entry for name. When name is executed, it will discard the definition
The Forth Interpreter and Compiler 163
Forth Programmer’s Handbook
name and all words defined after name in a user’s partition. The user’s dictionary pointer will be reset to the last definition in the vocabulary before name. Because the dictionary pointer is reset, the dictionary is truncated spatially as well as logically. Other system-dependent actions may be taken as well, such as restoration of interrupt vectors (see your product documentation).
MARKER has two uses:
!To discard only part of your definitions. For example, when testing, you may wish to reload only the last block, not your entire application.
!To create additional levels of overlays.
Suppose your application includes an overlay called GRAPHICS. After GRAPHICS is loaded, you want to be able to load one of two additional overlays, called COLOR and B&W, thus creating a second level of overlay. Here is the procedure to follow:
1.Define a marker as the final definition of GRAPHICS, using any word you want as a dictionary marker. For example:
MARKER OVERLAY
Preferably, such a definition would be placed at the bottom of the GRAPHICS load block.
2.Execute OVERLAY and then redefine it (since it forgets itself) on the first line of the load block of each level-two overlay. For instance,
( COLOR) OVERLAY MARKER OVERLAY
Thus, when you execute the phrase:
COLOR LOAD
the system will forget any definitions which may have been compiled after GRAPHICS and will restore the marker definition of OVERLAY in the event you want to load an alternate level-two definition, such as B&W.
By using different names for your markers, you may create any number of overlay levels.
164 The Forth Interpreter and Compiler