- •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 |
|
XOR |
( x1 x2 — x3 ) |
Core |
|
|
Return x3, the bit-by-bit exclusive or of x1 with x2. The phrase -1 XOR is equiv- |
||
|
alent to INVERT (one’s complement of the input value). |
|
|
|
Double-Precision Logical Operations |
|
|
DABS |
( d — +d ) |
Double |
|
|
Return the absolute value of a double-precision stack value. |
|
|
DMAX |
( d1 d2 — d3 ) |
Double |
|
|
Return d3, the larger of d1 and d2. |
|
|
DMIN |
( d1 d2 — d3 ) |
Double |
|
|
Return d3, the lesser of d1 and d2. |
|
|
DNEGATE |
( d — -d ) |
Double |
|
|
Change the sign of a double-precision stack value. Analogous to NEGATE. |
||
|
2.2.3 |
Comparison and Testing Operations |
|
These operations leave on the stack a number that is based upon a test of the contents of one or more items on top of the stack. In general, the test is destructive, in that it replaces the item(s) tested with the numerical results of the test. All numbers in Forth may be interpreted as true or false values; zero equals false, and any non-zero value equals true. The words below, which perform explicit tests, return -1 for true. Comparison and testing operations generally precede an IF, WHILE, or UNTIL construct.
You may also use - (minus) or D- as a not-equal test, because they return a non-
!zero difference if the two singleor double-precision numbers are unequal.
Glossary |
|
|
0< |
( n — flag ) |
Core |
|
Return flag, which is true if and only if n is less than zero. “zero-less-than” |
|
Forth Fundamentals 45
Forth Programmer’s Handbook
0<> |
( n — flag ) |
Core Ext |
|
Return flag, which is true if and only if n is not equal to zero. “zero-not-equal” |
|
0= |
( n — flag ) |
Core |
|
Return flag, which is true if and only if n is equal to zero. “zero-equal” |
|
0> |
( n — flag ) |
Core Ext |
|
Return flag, which is true if and only if n is greater than zero. “zero-greater-than” |
|
< |
( n1 n2 — flag ) |
Core |
|
Return flag, which is true if and only if n1 is less than n2. “less-than” |
|
<> |
( n1 n2 — flag ) |
Core Ext |
|
Return flag, which is true if and only if n1 is not equal to n2. “not-equal” |
|
= |
( n1 n2 — flag ) |
Core |
|
Return flag, which is true if and only if n1 is equal to n2. “equal” |
|
> |
( n1 n2 — flag ) |
Core |
|
Return flag, which is true if and only if n1 is greater than n2. “greater-than” |
|
D0< |
( d — flag ) |
Double |
|
Return flag, which is true if and only if the double-precision value d is less than |
|
|
zero. “D-zero-less” |
|
D0= |
( d — flag ) |
Double |
|
Return flag, which is true if and only if the double-precision value d is equal to |
|
|
zero. “D-zero-equal” |
|
D< |
( d1 d2 — flag ) |
Double |
|
Return flag, which is true if and only if d1 is less than d2. “D-less-than” |
|
D= |
( d1 d2 — flag ) |
Double |
|
Return flag, which is true if and only if d1 is equal to d2. “D-equals” |
|
DU< |
( ud1 ud2 — flag ) |
Double Ext |
|
Return flag, which is true if and only if ud1 is less than ud2. “D-U-less” |
|
FALSE |
( — flag ) |
Core Ext |
|
Return a flag that is false (binary zero). |
|
46 Forth Fundamentals