- •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
can display its associated shadow block.
Consult your product documentation for further details regarding your system’s features.
Glossary
LIST |
( u — ) |
Block Ext |
|
Display block u in a system-dependent format (usually 16 lines of 64 charac- |
|
|
ters each). Store u in the variable SCR. |
|
SCR |
( — a-addr ) |
Block Ext |
Return a-addr, the address of a cell containing the block number of the most recently LISTed block. “S-C-R”
3.5 FILE-BASED DISK ACCESS
Forth systems provide access to mass storage using a block-based or file-based method. This section discusses words that access mass storage using files. Section 3.4 discusses words used to access and manage disk blocks and block buffers in Forth. One or the other of these sections (occasionally both) will be relevant to a particular Forth system.
In a block-based system, mass storage is partitioned into blocks of 1024 bytes. In a file-based system, a host operating system is required; it provides and manages files of variable length, which Forth uses directly for mass storage.
Many items discussed in this section, such as the specific value and meaning of non-zero I/O result codes, allowable forms of filenames, values of line terminators, etc. are system dependent. Consult your product documentation for details.
3.5.1 Overview
The Forth words described in this section provide access to mass storage in the form of files, under the following conditions and assumptions:
96 System Functions
Forth Programmer’s Handbook
!Files are provided by a host operating system.
!File state information (e.g., current position in the file, size, etc.) is managed by the host operating system. File sizes are dynamically variable, so write operations will increase the size of a file as necessary.
!Filenames are represented as character strings. The format of the names is determined by the host operating system. Filenames may include system-specific pathnames.
!A file identifier (fileid) is a single-cell value that is passed to file operators to refer to specific files. Opening a file assigns it a file identifier, which remains valid until the file is closed. When the text interpreter is using a file as the input, its fileid will be returned by SOURCE-ID. The other possible values that SOURCE-ID can return are zero (if the user input device is the source), and -1 (if the source is a character string passed by EVALUATE).
!File contents are accessed as a sequence of characters. The file position is the character offset from the start of the file. The file position is updated by all read, write, and re-position commands.
!File read operations return an actual transfer count, which can differ from the requested transfer count.
!A file access method (fam) is a single-cell value indicating a permissible means of accessing a specific file, such as read/write or read-only.
!An I/O result (ior) is a single-cell value indicating the result of an I/O operation. A value of zero always indicates success; non-zero values are definitionand system-specific. An operation reaching the end of a file shall not consider it an error and shall return a zero ior.
3.5.2 Global File Operations
The words in this section are used to manipulate files as entire entities.
Glossary |
|
|
|
CLOSE-FILE |
( fileid — ior ) |
File |
|
|
Close the file identified by the fileid. Return an I/O result code. |
|
System Functions 97
Forth Programmer’s Handbook
CREATE-FILE ( c-addr u fam — fileid ior ) Core
Create a file whose name is given by the character string at c-addr and whose length is u, and open it with file access method fam. If the file already exists, recreate it as an empty file, replacing the pre-existing file of that name. If creation and opening are successful, return an ior of zero and the fileid. Otherwise, return a non-zero ior and an undefined value for fileid.
DELETE-FILE |
( c-addr u — ior ) |
File |
Delete the file whose name is given by the character string at c-addr and whose |
||
length is u. Return an I/O result code. |
|
|
FLUSH-FILE |
( fileid — ior ) |
File Ext |
Force any buffered contents of the file referred to by fileid to be written to mass storage, and the size information for the file to be recorded by the system, if changed. Return an ior of zero if successful; otherwise, return a system-depen- dent value.
OPEN-FILE ( c-addr u fam — fileid ior ) File
Open the file whose name is given by the character string at c-addr whose length is u, with file access method fam. If opening is successful, set the file position to zero, and return an ior of zero and the fileid; otherwise, return a non-zero ior and an undefined value for fileid.
RENAME-FILE ( c-addr1 u1 c-addr2 u2 — ior )
Rename the file whose current name is given by the character string at c-addr1 and whose length is u1, to the name given by the character string at c-addr2 and whose length is u2. Return an I/O result.
RESIZE-FILE ( ud fileid — ior ) File
Set the size of the file identified by fileid to ud, and return an I/O result code. If the file size is increased, the contents of the newly allocated space is indeterminate. After this operation (if successful), FILE-SIZE will return the same value for ud, and FILE-POSITION returns an undefined value.
98 System Functions
Forth Programmer’s Handbook
3.5.3 File Reading and Writing
The words in this section are used to read or write to a specific file.
Glossary |
|
|
INCLUDE-FILE |
( fileid — ) |
File |
Read and interpret the given file, performing the following steps: Save the current input source specification. Store the given fileid in SOURCE-ID, set BLK to zero, and make this file the input source. Read a line from the file at the current file position, fill the input buffer with the contents of the line, set >IN to zero, and interpret the buffer contents. Continue reading lines until the end of file is reached. When the end of the file is reached, close the file and restore the previous input source specification.
INCLUDED ( c-addr u — ) File
Same as INCLUDE-FILE, except the file is specified by its name, which is stored at c-addr and is of length u. The file is opened and its fileid is stored in
SOURCE-ID.
INCLUDE <filename> |
( — ) |
common usage |
Same as INCLUDE-FILE, except the file is specified by the filename which fol- |
||
lows in the input stream. |
|
|
READ-FILE |
( c-addr u1 fileid — u2 ior ) |
File |
Read and store text from the given file, without interpretation, and update FILE-POSITION. From the current position in the file identified by fileid, read u1 consecutive characters, storing them at c-addr. Return an ior and u2, the number of characters successfully read. If no exception occurs, return ior of zero and u2 = u1 or the number of characters actually read before encountering the end of the file, whichever is smaller. If FILE-POSITION was equal to FILE-SIZE before executing READ-FILE, u2 is zero. If a non-zero ior is returned, u2 is the number of characters successfully transferred before the exception occurred.
READ-LINE ( c-addr u1 fileid — u2 flag ior ) File
Read and store one line of text from the given file, without interpretation, and update FILE-POSITION: From the current position in the file identified by
System Functions 99