- •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
words in the following glossary are provided.
As an example of their use, you could compare a string whose address is returned by NAME with one temporarily stored at PAD, testing as follows:
PAD <length> DUP NAME SWAP COMPARE
SEARCH is generally used to find a short string in a longer string. It is used by the Forth editor.
Glossary |
|
|
|
COMPARE |
( c-addr1 u1 c-addr2 u2 — n ) |
String |
|
|
|
Compare the string specified by c-addr1 u1 to the string specified by c-addr2 u2 |
|
|
|
and return a result code n. The strings are compared character-by-character, |
|
|
|
beginning at the given addresses, up to the length of the shorter string or until |
|
|
|
a difference is found. If the two strings are identical and of equal lengths, n is |
|
|
|
zero. If the two strings are identical up to the length of the shorter string, n is |
|
|
|
-1 if u1 is less than u2, and +1 otherwise. If the two strings are not identical up |
|
|
|
to the length of the shorter string, n is -1 if the first non-matching character in |
|
|
|
the string at c-addr1 has a lesser numeric value than the corresponding charac- |
|
|
|
ter in the string at c-addr2, and +1 otherwise. |
|
SEARCH |
( c-addr1 u1 c-addr2 u2 — c-addr3 u3 flag ) |
String |
|
|
|
Search for a match for the string c-addr2 u2 in the string c-addr1 u1 (which is pre- |
|
|
|
sumed to be longer). If a match is found, return true with the address c-addr3 of |
|
|
|
the first matching character and the length u3 of the remainder of the string. If |
|
|
|
no match is found, c-addr3 = c-addr1, u3 = u1, and flag is false. |
|
|
|
PAD, Section 2.3.1 |
|
References |
|
|
2.4 NUMERIC OUTPUT WORDS
Numeric output words allow the display of numeric quantities as ASCII characters. This output is generally directed to the terminal.
Numeric output words are divided into two categories: normal output words
52 Forth Fundamentals
Forth Programmer’s Handbook
and conversion output words. The latter allow the picturing of ASCII text, in a manner that resembles COBOL picturing.
All numeric output words produce ASCII text, which is the ASCII number expressed in the current BASE. BASE is a user variable containing the current conversion radix, and is controlled with the appropriate radix word (e.g., DECIMAL or HEX) or by setting the value of BASE directly. For example, BASE may be set to binary by:
2 BASE !
References Numbers, Section 1.1.6
2.4.1 Standard Numeric Output Words
Several standard words allow displaying singleor double-precision signed numbers in various formats. All of them remove their arguments from the stack. To preserve a number you are about to display, DUP it first. Each display word produces an output string that consists of the following characters:
1.If the number is negative, a leading minus sign (hyphen).
2.The absolute value of the number, with leading zeroes suppressed. (The number zero results in a single zero in the output.)
3.In some cases, a trailing blank.
The standard numeric output words are:
Glossary
. |
( n — ) |
Core |
|
Remove the top of stack item and display it as a signed single-precision integer |
|
|
followed by one space. “dot” |
|
.R |
( n1 +n2 — ) |
Core Ext |
Display signed single-precision integer n1 with leading spaces, to fill a field of width +n2, right-justified. This word expects positive integer n2 on top of the stack to specify the length of the output field. The width of the printed string
Forth Fundamentals 53