- •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
The Language of Innovation...
Forth
Programmer’s
Handbook
Edward K. Conklin
Elizabeth D. Rather
and the technical staff of FORTH, Inc.
FORTH, Inc.
111 N. Sepulveda Boulevard, Suite 300 Manhattan Beach, California USA 90266–6847 310.372.8493 800.55.FORTH FAX: 310.318.7130 forthinc@forth.com www.forth.com
FORTH, Inc. makes no warranty of any kind with regard to this material, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. FORTH, Inc. shall not be liable for errors contained herein or for incidental or consequential damages in connection with the furnishing, performance, or use of this material.
All brand and product names are trademarks or registered trademarks of their respective companies.
Copyright © 1997, 1998 by FORTH, Inc. All rights reserved.
First edition, September 1997
Second printing, November 1997
Third printing (2nd ed.), August 1998
Fourth printing, September 1999
Fifth printing, May 2000
Sixth printing, August 2000
ISBN 0-9662156-0-5
This document contains information proprietary to FORTH, Inc. Any reproduction, disclosure, or unauthorized use of this document, either in whole or in part, is expressly forbidden without prior permission in writing from:
FORTH, Inc.
111 N. Sepulveda Boulevard, Suite 300
Manhattan Beach, California USA 90266–6847
310.372.8493 800.55.FORTH FAX: 310.318.7130
sales@forth.com www.forth.com
ii
CONTENTS
Welcome! xi
About the Forth Programming Language xi About This Book xi
How to Use This Book xi Reference Materials xii How to Proceed xii
1.Introduction 1
1.1Forth Language Features 2
1.1.1 Definitions of Terms 2
1.1.2Dictionary 3
1.1.3Data Stack 7
1.1.4Return Stack 9
1.1.5Text Interpreter 10
1.1.6Numeric Input 13
1.1.7 Two-stack Virtual Machine 15
1.2 Forth Operating System Features 17
1.3The Forth Assembler 19
1.3.1Notational Differences 19
1.3.1.1Instruction Mnemonics 19
1.3.1.2Addressing Modes 20
1.3.1.3Instruction Format 20
1.3.1.4 Labels, Branches, and Structures 20
1.3.2Procedural Differences 21
1.3.2.1 |
Resident Assembler 21 |
iii
Forth Programmer’s Handbook
1.3.2.2 |
Immediately Executable Code |
21 |
1.3.2.3 |
Relationship to Other Routines |
21 |
1.3.2.4Register Usage 21
1.4 Documentation and Programmer Aids 22
1.4.1Comments 22
1.4.2Locating Command Source 24
1.4.3Cross-references 24
1.4.4 Decompiler and Disassembler 25
1.5Interactive Programming—An Example 27
2.Forth Fundamentals 31
2.1Stack Operations 31
2.1.1Stack Notation 31
2.1.2 |
Data Stack Manipulation Operations |
33 |
2.1.3 |
Memory Stack Operations 35 |
|
2.1.4 |
Return Stack Manipulation Operations |
36 |
2.1.5Programmer Conveniences 37
2.2 |
Arithmetic and Logical Operations |
39 |
||
2.2.1 |
Arithmetic and Shift Operators |
39 |
|
|
2.2.2 |
Logical and Relational Operations |
44 |
|
|
2.2.3 |
Comparison and Testing Operations |
45 |
||
2.3 |
Character and String Operations |
47 |
|
|
2.3.1 |
The PAD—Scratch Storage for Strings |
48 |
||
2.3.2 |
Single-Character Reference Words 49 |
|||
2.3.3 |
String Management Operations |
49 |
|
|
2.3.4 |
Comparing Character Strings |
51 |
|
|
2.4Numeric Output Words 52
2.4.1 |
Standard Numeric Output Words 53 |
2.4.2 |
Pictured Number Conversion 54 |
2.4.2.1 |
Using Pictured Numeric Output Words 55 |
iv
Forth Programmer’s Handbook
2.4.2.2 |
Using Pictured Fill Characters |
57 |
2.4.2.3 |
Processing Special Characters |
58 |
2.5Program Structures 59
2.5.1Indefinite Loops 60
2.5.2 Counting (Finite) Loops 63
2.5.3Conditionals 66
2.5.4CASE Statement 67
2.5.5Un-nesting Definitions 69
2.5.6Vectored Execution 70
2.6Exception Handling 74
3.System Functions 77
3.1Vectored Routines 77
3.2System Environment 78
3.3Serial I/O 81
3.3.1Terminal Input 81
3.3.2Terminal Output 84
3.3.3 Support of Special Terminal Features 85
3.4Block-Based Disk Access 86
3.4.1Overview 86
3.4.2Block-Management Fundamentals 87
3.4.3 |
Loading Forth Source Blocks 91 |
3.4.3.1 |
The LOAD Operation 92 |
3.4.3.2 |
Named Program Blocks 94 |
3.4.3.3 |
Block-based Programmer Aids and Utilities 95 |
3.5 File-Based Disk Access 96
3.5.1Overview 96
3.5.2 |
Global File Operations |
97 |
3.5.3 |
File Reading and Writing |
99 |
v
Forth Programmer’s Handbook
3.5.4 File Support Words 100
3.6 Time and Timing Functions 102
3.7Dynamic Memory Management 102
3.8Floating Point 103
3.8.1 |
Floating-Point System Guidelines 104 |
3.8.2 |
Input Number Conversion 105 |
3.8.3Output Formats 106
3.8.4 Floating-Point Constants, Variables, and Literals 107
3.8.5Memory Access 107
3.8.6 Floating-Point Stack Operators 108
3.8.7Floating-Point Arithmetic 110
3.8.8Floating-Point Conditionals 111
3.8.9 Logarithmic and Trigonometric Functions 112
3.8.10Address Management 114
3.8.11Custom I/O 116
4. The Forth Interpreter and Compiler 119
4.1 The Text Interpreter 119
4.1.1Input Sources 119
4.1.2 Source Selection and Parsing 121
4.1.3Dictionary Searches 123
4.1.4 |
Input Number Conversion |
125 |
|
4.1.5 |
Character String Processing |
127 |
|
4.1.5.1 |
Scanning Characters to a Delimiter |
127 |
|
4.1.5.2 |
Compiling and Interpreting Strings |
129 |
|
4.1.6 |
Text Interpreter Directives |
131 |
|
4.2 Defining Words 132 |
|
|
|
4.2.1 |
Creating a Dictionary Entry |
132 |
|
4.2.2Variables 134
4.2.3CONSTANTs and VALUEs 136
4.2.4Colon Definitions 138
4.2.5Code Definitions 141
vi
|
|
|
Forth Programmer’s Handbook |
4.2.6 |
Custom Defining Words 142 |
|
|
4.2.6.1 |
Basic Principles of Defining Words 142 |
||
4.2.6.2 |
High-level Defining Words |
144 |
|
4.3 Compiling Words and Literals |
146 |
|
|
4.3.1 |
ALLOTing Space in the Dictionary |
147 |
|
4.3.2 |
Use of , and C, to Compile Values |
147 |
|
4.3.3 |
The Forth Compiler 149 |
|
|
4.3.4 |
Use of Literals and Constants in : Definitions 154 |
4.3.5Explicit Literals 154
4.3.6 Use of ['] to Compile Literal Addresses 156
4.3.7Compiling Strings 156
4.4Compiler Directives 158
4.4.1 |
Making Compiler Directives 159 |
4.4.2 |
The Control-flow Stack and Custom Compiling Structures 161 |
4.5Overlays 163
4.6Word Lists 165
4.6.1Basic Principles 165
4.6.2 |
Managing Word Lists 167 |
4.6.3 |
Sealed Word Lists 168 |
5.The Assembler 169
5.1Code Definitions 169
5.2Code Endings 171
5.3Assembler Instructions 171
5.4Notational Conventions 172
5.5 Use of the Stack in Code 174
vii
Forth Programmer’s Handbook
5.6Addressing Modes 174
5.7Macros 176
5.8Program Structures 177
5.9Literals 179
5.10Device Handlers 179
5.11Interrupts 180
5.12Example 181
6. Programming Style and Editing Standards 183
6.1 Guidelines for BLOCK-based source 184
6.1.1Stack Effects 184
6.1.2General Comments 185
6.1.3 Spacing Within Source 185
6.2 Open Firmware Coding Style 186
6.2.1Typographic Conventions 186
6.2.2 Use of Spaces 187
6.2.3Conditional Structures 187
6.2.4do…loop Structures 188
6.2.5begin…while…repeat Structures 188
6.2.6begin…until…again Structures 189
6.2.7Block Comments 189
6.2.8Stack Comments 190
6.2.9 |
Return Stack Comments 190 |
6.2.10 |
Numbers 190 |
viii
Forth Programmer’s Handbook
6.3 Wong’s Rules for Readable Forth 191
6.3.1Example: Magic Numbers 192
6.3.2Example: Factoring 192
6.3.3Example: Simplicity 193
6.3.4 |
Example: Testing Assumptions 194 |
|
6.3.5 |
Example: IF Avoidance |
194 |
6.3.6 |
Example: Stack Music |
196 |
6.3.7Summary 197
6.4Naming Conventions 197
Appendix A: |
Bibliography |
201 |
|
Appendix B: |
Glossary & Notation |
203 |
|
B.1 |
Abbreviations |
203 |
|
B.2 |
Glossary 204 |
|
|
B.3 |
Data Types in Stack Notation 207 |
||
B.4 |
Flags and IOR Codes 210 |
||
B.5 |
Forth Glossary Notation |
210 |
|
Appendix C: |
Index to Forth Words |
213 |
|
General Index |
227 |
|
|
ix