DX-FORTH v4.30

This commit is contained in:
davidly 2024-07-09 09:07:02 -07:00
parent a2f4b9c609
commit 58cc1a4889
58 changed files with 16670 additions and 0 deletions

Binary file not shown.

BIN
Artek Ada v125/e.EXE Normal file

Binary file not shown.

BIN
Artek Ada v125/e.axe Normal file

Binary file not shown.

1
DX-FORTH v430/ASM.SCR Normal file

File diff suppressed because one or more lines are too long

609
DX-FORTH v430/ASM.TXT Normal file
View File

@ -0,0 +1,609 @@
DX-Forth 8086/87 Assembler
--------------------------
Contents:
1. Assembler interface
2. Instruction format
3. Operands
4. Data sizes
5. Instruction aliases
6. Register usage
7. Local labels
8. Structured conditionals
9. Mixing code and high-level forth
10. No-name code definitions
11. Forth addresses
12. Predefined macros
13. Compiler security
14. Miscellaneous tools
15. 8087 support
16. Error messages
17. F83 differences
1. Assembler interface
Main words:
CODE <name> Begin a code definition
LABEL <name> As for CODE but instead of <name> executing the code
sequence, it returns the execution address (xt).
;CODE The code equivalent of DOES>. Ends a high-level forth
defining sequence and begins a code sequence that will
be performed when a child word is executed. Used in
the form:
: <name> CREATE ... ;CODE ... END-CODE
At run-time the child's parameter field address is
placed on the stack.
END-CODE End a CODE LABEL or ;CODE definition
Macro support:
MACRO name Begin an assembler macro definition
ENDM End a macro assembler definition
Mixing code and high-level forth:
C: Switch from code to begin a forth sequence. Register
SI is pushed to the return stack.
;C Switch from forth to begin a code sequence. Register
SI popped from the return stack.
Miscellaneous:
[ASM Add ASSEMBLER to the search order. Initialize the
assembler and enter interpret state. Note: does
not clear local labels or initialize stack check.
ASM] Remove ASSEMBLER from the top of the search order.
Note: does not exit interpret state.
READY Clear local labels and initialize stack check.
CHECK Check stack level and resolve labels since READY was
last issued.
-ASM Discard the assembler and all subsequent words.
2. Instruction format
As with most forth assemblers, operands precede the instruction.
The following examples show DX-Forth assembler syntax as compared
with conventional Intel notation.
Intel DX-Forth
----- --------
CLI CLI
IRET IRET
REP REP
REPNZ REPNZ
CS: CS:
POP AX AX POP
PUSH AX AX PUSH
INT 37 37 INT
IN AX,23 23 # AX IN
IN AX,DX DX AX IN
OUT 23,AL AL 23 # OUT
OUT DX,AL AL DX OUT
MOV AX,BX BX AX MOV
CMP AL,DL DL AL CMP
ROL AX,1 AX ROL
ROL AX,1 AX 1 ROL
ROL AX,CL AX CL ROL
ROL CL,1 CL 1 ROL
XCHG [BX],AX AX 0 [BX] XCHG
XCHG AX,[BX] 0 [BX] AX XCHG
MOV AL,9 9 # AL MOV
MOV AX,1234 1234 # AX MOV
MOV AX,-1 -1 # AX MOV
MOV BX,AX AX BX MOV
MOV [2344],AL AL 2344 ) MOV
MOV AX,[1234] 1234 ) AX MOV
MOV [BX],AL AL 0 [BX] MOV
POP [BX] 0 [BX] POP
MOV [BX+9],AX AX 9 [BX] MOV
MOV [BX+SI+9],AX AX 9 [BX+SI] MOV
JMP 1234 1234 ) JMP
JMP [1122] 1122 [] JMP
JMP FAR [4455] 4455 [] FAR JMP
JMP 5678:1234 1234 5678 ) FAR JMP
JNZ HERE+5 HERE 5 + JNZ
JMP SHORT HERE+5 HERE 5 + JU
RET RET
RETF FAR RET
RET 14 14 +RET
CMPSB BYTE CMPS
CMPSW CMPS
MOVSB BYTE MOVS
MOVSW MOVS
SCASB BYTE SCAS
SCASW SCAS
LODSB BYTE LODS
LODSW LODS
STOSB BYTE STOS
STOSW STOS
3. Operands
Operands to instructions may be registers, memory locations or
immediate values. When an operand is not a register, it must be
followed by a symbol to indicate its type:
# operand is an immediate number
) operand is a memory location
[] operand is an indirect memory location for CALL/JMP
Exceptions are the loop and short jump instructions - these do not
use ) after the memory address.
4. Data sizes
When the syntax of the instruction does not make it clear, then
the memory operand data size is assumed to be:
- 16 bit integer for 8086 instructions
- 64 bit real for 8087 instructions
Valid overides are:
BYTE ( -- ) 8 bit integer
WORD ( -- ) 16 bit integer
DWORD ( -- ) 32 bit integer or real
QWORD ( -- ) 64 bit integer or real
TBYTE ( -- ) 80 bit real
Notes:
- WORD DWORD QWORD TBYTE are present only when the 8087 assembler
extension is loaded.
- BYTE must only be applied to instructions that require it.
Attempting to use BYTE on instructions which are implicitly 8-bit
e.g. BYTE AL DL MOV may adversely affect subsequent instructions.
5. Instruction aliases
Several Intel 8086 instructions have alias names. The table below
lists the preferred DX-Forth name and the corresponding Intel alias.
DX-Forth Intel DX-Forth Intel
JO - JPO JNP
JNO - JL JNGE
JC JB JNAE JNL JGE
JNC JNB JAE JG JNLE
JA JNBE JNG JLE
JNA JBE JU * JMP SHORT
JZ JE LOOPZ LOOPE
JNZ JNE LOOPNZ LOOPNE
JS - REPZ REP REPE
JNS - REPNZ REPNE
JPE JP SHL SAL
* "Jump Unconditional"
6. Register usage
Code words may use any 8086 cpu register except:
SI forth interpretive pointer
BP return stack pointer
CS DS SS
Segment registers CS DS SS are initialised to the forth code
segment CSEG.
If any of these registers are to be used in a code definition for
other purposes, their contents must be saved beforehand and restored
afterwards. Register ES is free for use as a scratch register.
7. Local labels
The DX-Forth assembler uses local labels to mark addresses for flow
control. Labels are assigned and referenced as follows:
$: ( n -- ) assign the address of the current dictionary
location HERE to label n
$ ( n -- addr ) return the address assigned to label n
The maximum number of labels per definition is 20 and are numbered 1
to 20. The maximum number of forward references is 25. These limits
should be sufficient for most applications but can be increased by
altering the assembler source and re-compiling.
8086 instructions that may use forward references as operands includes
jumps, calls and other instructions as determined empirically.
The following demonstrates the use of labels to define the word 0= .
It uses one label and one forward reference.
CODE 0= ( n -- flag )
AX AX SUB \ load AX with false flag (0)
DX POP \ pop n to DX
DX DX OR \ test DX
1 $ JNZ \ jump to label 1 if DX <> 0
AX DEC \ change flag to true ($FFFF)
1 $: \ define label 1
AX PUSH \ push flag onto stack
'NEXT ) JMP \ return to forth
END-CODE
It can be simplified by the use of macros e.g.
CODE 0= ( n -- flag )
AX AX SUB
DX POP
DX DX OR
1 $ JNZ
AX DEC
1 $:
1PUSH \ return to forth pushing AX onto stack
END-CODE
8. Structured conditionals
Structured conditionals are an alternative or adjunct to local labels.
They include:
IF ELSE THEN BEGIN WHILE REPEAT UNTIL AGAIN AHEAD
Conditionals that perform a test i.e. IF WHILE UNTIL must be
preceeded by one of the following condition flags:
U>= U< 0<> 0= U> U<= 0>= 0< >= < > <= CY NC OV NO
PO PE CXNZ NEVER
NEVER is used before a conditional test to create an unconditional
jump. E.g. AHEAD and AGAIN are macros for NEVER IF and NEVER UNTIL
respectively. N.B. Structured conditionals are restricted to short
relative branches.
Structured conditionals are restricted to short relative branches.
Example
CODE 0= ( n -- flag )
AX AX SUB
DX POP
DX DX OR
0= IF
AX DEC
THEN
1PUSH
END-CODE
Structured conditionals are not included by default and must be loaded
before they can be used e.g. 1 FLOAD ASMCOND.SCR . N.B. If using the
8087 assembler extensions ensure these are loaded before the structured
conditionals.
9. Mixing code and high-level forth
The assembler allows free mixing of machine-code and high-level forth.
It is sometimes convenient to execute high-level forth words from
within a code definition.
Example - display a message within a code definition
CODE TEST ( -- )
C: \ begin forth
." Hi There!"
;C \ end forth
NEXT
END-CODE
Note: SI register is automatically pushed to the return stack before
the forth sequence executes and restored afterwards.
The reverse is also possible i.e execute machine code within high-
level forth:
: TEST ( -- )
5 0 DO
I
;C \ begin code
AX POP 23 # AX ADD AX PUSH
C: \ end code
.
LOOP ;
See "Register usage" for a list of registers that must be preserved.
10. No-name code definitions
[ASM ASM] READY CHECK allow the user to assemble code sequences for
any imaginable situation. Here is 0= coded as a nameless definition
in the style of :NONAME .
HERE ( start address of code routine )
[ASM READY
( x -- flag )
AX AX SUB
DX POP
DX DX OR
1 $ JNZ
AX DEC
1 $:
1PUSH \ return to forth pushing AX onto stack
CHECK ASM]
( -- xt ) \ leaves xt address
If local labels are not used or compiler security is not required
then READY CHECK could be omitted.
11. Forth addresses
The following functions return addresses in the forth kernel which
may be useful when writing code definitions. See also 'Predefined
macros'.
'NEXT ( -- adr ) address of centralized NEXT
UP ( -- adr ) pointer to forth USER area
FSP ( -- adr ) pointer to separate floating-point stack
DOCOL ( -- adr ) enter colon routine
EXIT1 ( -- adr ) exit colon routine
TOD ( -- adr ) routine read BIOS tick timer AX:DX
TSYNC ( -- adr ) routine wait for timer tick, exit AX:DX = TOD
UPC ( -- adr ) routine make AL uppercase
12. Predefined macros
The assembler defines several useful macros -
NEXT compile in-line NEXT
1PUSH push AX then jump to NEXT
2PUSH push DX AX then jump to NEXT
USER# calculate USER variable offset
[UP] USER addressing mode
1PUSH and 2PUSH make use of the centralized NEXT. Users wanting
maximum performance (at the expense of code size) may replace 1PUSH
and 2PUSH with their in-line equivalents e.g.
AX PUSH NEXT ... instead of ... 1PUSH
DX PUSH AX PUSH NEXT ... instead of ... 2PUSH
USER# converts a USER variable address to its offset. Equivalent
to: UP @ -
[UP] works like an assembler addressing mode taking a USER variable
as an argument. After the operation register DI holds the address
of the specified user variable (unless DI was used as a destination).
Examples:
BASE [UP] AX MOV load AX with contents of BASE, DI = addr BASE
10 # BASE [UP] MOV set BASE to decimal, DI = addr BASE
BASE [UP] PUSH push BASE contents to stack, DI = addr BASE
BASE [UP] DI MOV load DI with contents of BASE
Note: The [UP] macro can be expensive since it generates three machine
instructions each time it is invoked. If your code routine requires
access to several user variables it may be more efficient to load BX
or DI with the USER base address and use USER# to supply the various
offsets e.g.
UP ) DI MOV point DI to the USER area
10 # BASE USER# [DI] MOV set BASE to decimal
>IN USER# [DI] INC increment >IN
13. Compiler security
As with colon definitions, the assembler employs stack checking to
verify statements have been correctly written. Normally very useful
there may be occasions when one needs to turn off stack checking,
albeit temporarily e.g.
CHECKING OFF
CODE TEST
...
HERE ( adr ) \ push location onto the stack
...
NEXT
END-CODE
CHECKING ON
( adr )
14. Miscellaneous tools
When machine language is used extensively there can be a need for
tools found in conventional assemblers. Below are several the author
has found useful. They are not resident in the forth assembler but
defined as needed.
SYSTEM
\ Adjust HERE to an even address padding with a NOP instruction
: EVEN ( -- ) HERE 1 AND IF $90 C, THEN ;
\ Name value x
: EQU ( x "name" -- ) SYS @ TUCK 0= SYS ! VALUE SYS ! ;
\ Name address at HERE and compile a 16-bit value
: DW ( 16b "name" -- ) HERE EQU , ;
\ Name address at HERE and compile a 8-bit value
: DB ( 8b "name" -- ) HERE EQU C, ;
APPLICATION
15. 8087 support
ASM87.SCR contain extensions to allow the assembly of 8087 floating
point instructions. Once loaded, the following instructions become
available:
Intel Forth
----- -----
F2XM1 F2XM1
FABS FABS
FADD m/r m/r FADD
FADD ST,ST(n) ST(n) ST FADD
FADD ST(n),ST ST ST(n) FADD
FADDP ST(n),ST ST(n) FADDP
FBLD m/r m/r FBLD
FBSTP m/r m/r FBSTP
FCHS FCHS
FCLEX FCLEX
FCOM m/r m/r FCOM
FCOM ST(n) ST(n) FCOM
FCOMP m/r m/r FCOMP
FCOMP ST(n) ST(n) FCOMP
FCOMPP FCOMPP
FCOS FCOS **
FDECSTP FDECSTP
FDISI FDISI
FDIV m/r m/r FDIV
FDIV ST,ST(n) ST(n) ST FDIV
FDIV ST(n),ST ST ST(n) FDIV
FDIVP ST(n),ST ST(n) FDIVP
FDIVR m/r m/r FDIVR
FDIVR ST(n),ST ST(n) FDIVR
FDIVRP ST(n),ST ST(n) FDIVRP
FENI FENI
FFREE ST(n) ST(n) FFREE
FIADD m/r m/r FIADD
FICOM m/r m/r FICOM
FICOMP m/r m/r FICOMP
FIDIV m/r m/r FIDIV
FIDIVR m/r m/r FIDIVR
FILD m/r m/r FILD
FIMUL m/r m/r FIMUL
FINCSTP FINCSTP
FINIT FINIT
FIST m/r FIST
FISTP m/r m/r FISTP
FISUB m/r m/r FISUB
FISUBR m/r m/r FISUBR
FLD m/r m/r FLD
FLD ST(n) ST(n) FLD
FLD1 FLD1
FLDCW m/r m/r FLDCW
FLDENV m/r m/r FLDENV
FLDL2E FLDL2E
FLDL2T FLDL2T
FLDLG2 FLDLG2
FLDLN2 FLDLN2
FLDPI FLDPI
FLDZ FLDZ
FMUL m/r m/r FMUL
FMUL ST,ST(n) ST(n) ST FMUL
FMUL ST(n),ST ST ST(n) FMUL
FMULP ST(n),ST ST(n) FMULP
FNOP FNOP
FPATAN FPATAN
FPREM FPREM
FPREM1 FPREM1 **
FPTAN FPTAN
FRNDINT FRNDINT
FRSTOR m/r m/r FRSTOR
FSAVE m/r m/r FSAVE
FSCALE FSCALE
FSIN FSIN **
FSINCOS FSINCOS **
FSQRT FSQRT
FST m/r m/r FST
FST ST(n) ST(n) FST
FSTCW m/r m/r FSTCW
FSTENV m/r m/r FSTENV
FSTP m/r m/r FSTP
FSTP ST(n) ST(n) FSTP
FSTSW AX AX FSTSW *
FSTSW m/r m/r FSTSW
FSUB m/r m/r FSUB
FSUB ST,ST(n) ST(n) ST FSUB
FSUB ST(n),ST ST ST(n) FSUB
FSUBP ST(n),ST ST(n) FSUBP
FSUBR m/r m/r FSUBR
FSUBR ST,ST(n) ST(n) FSUBR
FSUBRP ST(n),ST ST(n) FSUBRP
FTST FTST
FXAM FXAM
FXCH ST(n) ST(n) FXCH
FXTRACT FXTRACT
FYL2X FYL2X
FYL2XP1 FYL2XP1
* 80287/80387 only
** 80387 only
Notes:
WAIT instructions are not automatically encoded. A WAIT should be
inserted:
- before each floating point instruction (8087 only)
- after any floating point instruction that writes to memory
Several Forth and Unix-derived 8087 assemblers are known to have
bugs associated with the following instructions:
FSUBP
FSUBRP
FDIVP
FDIVRP
FSUB/FSUBR/FDIV/FDIVR ST(i),ST
Programmers should therefore exercise care when using 8087 source
code taken from third party or public domain sources.
16. Error messages
"definition incomplete" Definition was not properly formed.
"duplicate label" Label number was previously used.
"execution only" Word may be used only during execution.
"invalid label" Incorrect label number or too many
labels used.
"branch out of range" Exceeded the range of a short relative
branch.
"too many references" Exceeded the maximum number of forward
references to labels.
"unresolved reference" A label was referenced but never defined.
Note: the assembler has limited error checking and it is possible to
compile code using incorrect modes or operands without any warning
given. Take care!
17. F83 differences
The DX-Forth assembler is based on the 8086 assembler included with
Laxen/Perry F83 Forth. Differences from the F83 assembler are:
- Uses local labels rather than structured conditionals
- REP behaviour changed (in F83, REP functioned as REPNZ !)
- Alternate Intel names used for some conditional jump instructions
- ) and [] replaces #) and S#)
- Additional syntax forms for OUT, XCHG, rotate/shift instructions
- In DX-Forth ;CODE places the child's parameter field address
on top of the stack; in F83 the address was held at BX+2.

1
DX-FORTH v430/ASM87.SCR Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
\ 8086 structured conditionals .( 8086 structured conditionals ) assembler definitions hidden hex system warning off 70 constant NO 71 constant OV 72 constant U>= 73 constant U< 74 constant 0<> 75 constant 0= 76 constant U> 77 constant U<= 78 constant 0>= 79 constant 0< 7A constant PO 7B constant PE 7C constant >= 7D constant < 7E constant > 7F constant <= 0E3 constant CXNZ 0EB constant NEVER aka U>= NC aka U< CY : THEN here over rel swap c! ; aka HERE BEGIN : UNTIL c, here rel c, ; : IF c, begin 0 c, ; : AHEAD never if ; : ELSE ahead swap then ; : WHILE if swap ; : AGAIN never until ; : REPEAT again then ; ( : TIMES # CX MOV begin ; ) forth definitions decimal application warning on

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
\ BREAK GO Breakpoint tool (adapted from Forth Dimensions 5/1) BREAK is inserted into the application source code at the point to be debugged. When BREAK is subsequently executed, the application is temporarily halted and the current stack contentsdisplayed. The user will then be in a special interpret loop (indicated by the '<ok>' prompt) during which time the system may be examined. The application can be resumed at any time using GO. Executing QUIT or ABORT while halted (e.g. as a result of mistyping a command) will result in the user dropping back to forth. \ BREAK GO forth definitions system variable bsd create buf 80 allot : bip ( -- ) begin cr ." <ok> " buf dup 80 accept space evaluate again ; \ Halt application : BREAK ( i*x -- i*x ) cr ." BREAK stack = " .s depth bsd ! ['] bip catch dup -256 - if throw else drop then ; \ Resume application : GO ( i*x -- i*y ) depth bsd @ - bsd off abort" stack changed" -256 throw ; application behead bsd bip

45
DX-FORTH v430/CHANGES.TXT Normal file
View File

@ -0,0 +1,45 @@
IMPORTANT CHANGES
This document discusses changes to DX-Forth for DOS that may adversely
affect previously written programs. It is recommended users update their
programs to the latest DX-Forth version. See WHATSNEW.TXT for a summary
of other changes and additions.
v4.30
Removed immediate EXIT and renamed (EXIT) to EXIT.
v4.07
-TRAILING ZCOUNT now use the SSEG segment. See SSEG in the glossary
for details.
v4.05
EDIT can no longer be used to load the editor from disk. You must use
SED or TED for that. Once the editor is loaded and saved as part of
the system, EDIT can be added as a synonym.
v4.03
ALLOT has been changed (for the better). Unlike Forth-94 ALLOT only
unsigned values may be used. Applications which used negative values
with ALLOT should be changed to use -ALLOT instead. Programs which
require Forth-94 behaviour can be accommodated with the following
redefinition:
: ALLOT ( n -- ) NEGATE -ALLOT ;
Note however that memory checking is not performed.
v4.02
Functions '.' and '?' adopt the eForth behaviour i.e. when BASE is
decimal display signed; otherwise display unsigned. Only these
functions and those which use them are affected. Applications
requiring Forth-94 behaviour may redefine:
: . ( n -- ) S>D D. ;

View File

@ -0,0 +1,11 @@
Disclaimer:
The projects presented here are experimental in nature. They
may be incomplete, not fully tested or contain defects. Being
free software, it is provided 'as is' and without any warranty.
Use of these projects or information is strictly at your own
risk and responsibility.
Project material written and created by the author is public
domain; any non-original or reference material included may be
subject to copyright by their respective owners.

1
DX-FORTH v430/DOSLIB.SCR Normal file

File diff suppressed because one or more lines are too long

BIN
DX-FORTH v430/DX.EXE Normal file

Binary file not shown.

2740
DX-FORTH v430/DXFORTH.GLO Normal file

File diff suppressed because it is too large Load Diff

900
DX-FORTH v430/DXFORTH.TXT Normal file
View File

@ -0,0 +1,900 @@
DX-Forth for MS-DOS
-------------------
This is the documentation for DX-Forth. It is divided into two parts:
- A walk-through that introduces new users (even those without
previous Forth experience) to a few concepts and illustrates some of
DX-Forth's special features. However, no attempt is made to teach
Forth - for this, get hold of an introductory text such as:
"Forth Programmer's Handbook", Conklin & Rather
"Programming Forth", Stephen Pelc
"And so Forth...", J.L. Bezemer
- A technical section for prospective DX-Forth programmers. It assumes
the reader has some familiarity with the Forth language programming.
Contents:
---------
1. Introduction
1.1 Overview
1.2 Distribution files
1.3 Acknowledgments
1.4 Legal
1.5 Installation
1.6 Getting started
1.7 Source files
1.8 Screen editor
1.9 Resident text file editor
1.10 Command-line interface
1.11 Machine code assembler
1.12 Increasing System space
1.13 Further suggestions
1.14 Error messages
2. Programming reference
2.1 File system
2.2 Application and System words
2.3 Executing applications
2.4 No Warm-Boot option
2.5 User Patch area
2.6 Overlays
2.7 Multitasking
2.8 User variables
2.9 System vectors
2.10 Deferred words
2.11 Search order
2.12 Compiler security
2.13 Exception handling
2.14 Exception codes
2.15 Key codes
1. Introduction
1.1 Overview
DX-Forth is a Forth language compiler and development system
for MS-DOS 2.x and compatible disk operating systems. It is
intended to be a complete, easy to use, programming tool for
the creation of DOS applications.
Features include:
- ANS-FORTH Standard (FORTH-94) *
- Fast direct-threaded code
- Generate turnkey applications without compiler overhead
- Fast floating point and trigonometric functions
- Forth-94 file I/O
- DOSLIB application library
- Multitasking
- ANS locals
- Overlays for large applications
- 8086/87 Forth assembler for CODE words
- Full source code included
* DX-FORTH 4 generally follows the FORTH-94 Standard but
does not seek to be strictly compliant.
1.2 Distribution files
See FILES.TXT
1.3 Acknowledgments
No software is written in a vacuum; therefore the author wishes to
gratefully acknowledge all those in the CP/M and Forth communities who
have generously made their source code available for public scrutiny.
Without these to serve as a starting point and source for ideas,
DX-Forth would not have been written.
1.4 Legal
DX-Forth and all the files in this distribution (apart from excerpts
taken from the FORTH-83 and ANS-FORTH documents) are hereby placed into
the PUBLIC DOMAIN by the author.
DX-Forth is an experimental software and is provided without support or
warranty. The author makes no guarantee as to fitness for purpose, nor
assumes liability for any error, omission, damage or loss caused by the
use of DX-Forth. Anyone wishing to use this software does so entirely
at their own risk.
1.5 Installation
Not applicable to the MS-DOS version of DX-Forth.
1.6 Getting started
Several versions of the DX-Forth compiler are available:
FORTH.EXE The forth compiler kernel. It includes everything
required to load and compile forth source files.
FORTH-F.EXE Same as FORTH.EXE but includes software floating point
and trigonometric functions. These increase the size
of the kernel by approximately 3K bytes.
DX.EXE FORTH-F.EXE with full-screen editor loaded.
FORTH-C.EXE Same as FORTH-F.EXE but uses "common stack" model
i.e. floating point items are placed on the data stack
rather than on a separate stack.
Note: FORTH-C.EXE is not in the distribution but can
be generated by rebuilding the system with FMAKE.BAT
First, enter forth by executing FORTH.EXE (or FORTH-F.EXE or DX.EXE)
from the DOS prompt e.g.
A> FORTH
You will be greeted with DX-Forth's start-up screen showing the
version number and compilation date. If you executed FORTH-F.EXE
you will also be informed that the floating point functions are
available.
Now type
FYI
"For Your Information". It displays information about the current
forth environment including dictionary size, vocabularies, logged
drive and open screenfiles.
To see the names of functions (Forth calls them "words") in the
dictionary, type
WORDS
Press any key to stop the display or <space> to pause. If you want
to see only word names that contain the sequence 'MOD' then type
WORDS: MOD
You will notice some words are accompanied by an attribute.
The bold attribute (normally blue) indicates the word resides in the
SYSTEM dictionary. All other words reside in the APPLICATION
dictionary. If the brightness attribute is on, it indicates the word
is IMMEDIATE. Attributes are accumulative. Thus a word that appears
in bold and has the brightness toggled is both a SYSTEM word and
IMMEDIATE.
Forth users will be familiar with IMMEDIATE words. SYSTEM words are
peculiar to DX-Forth and are explained in the programming section.
You can capture screen output to a printer e.g.
PRINTER WORDS
then restore output to the console with
CONSOLE
Adding a new function to forth's dictionary is easy. Let's try the
ubiquitous 'hello world' program. Type the following paying
attention to the space between ." and Hello .
: HELLO-WORLD ." Hello world" ;
If you make a mistake entering text you may use the backspace key
<BS> to delete the previous character, or escape key <ESC> to erase
the entire line.
Spaces are important to forth as they distinguish elements within a
forth statement. Forth syntax is very simple - a forth statement
consists of functions or numbers separated by one or more spaces.
In the example above : ." ; each represents a distinct forth
function.
You have just compiled a new function or 'word' called HELLO-WORLD.
Now type
WORDS
This lists all words in the current vocabulary. <SPACE> key may
be used to pause/resume the listing or <ESC> to stop. Note that
HELLO-WORLD appears at the top of the list since it was the most
recent addition to the dictionary.
Now execute HELLO-WORLD by typing its name. It should display the
text
Hello world
Should you need to enter a quote character '"' within a quote-
delimited string, this may be done by entering it twice e.g.
S" this text includes ""quote"" marks" CR TYPE
produces
this text includes "quote" marks
Removing a word from the dictionary is even easier. Type
FORGET HELLO-WORLD
This discards HELLO-WORLD ... and any forth word you defined after
it! Use WORDS to check that HELLO-WORLD was deleted.
Perhaps you would like to save HELLO-WORLD as your first turnkey DOS
application. To do this, re-enter the HELLO-WORLD definition if you
discarded it. Once you have tested it to make sure that it works as
expected, save it to disk with
TURNKEY HELLO-WORLD HELLO
If you now type DIR *.EXE you should see HELLO.EXE in the disk
directory.
Now - the most important thing you should know - how to get out of
forth and back to DOS. Do this now by typing
BYE
Now that you are back in DOS you may try out your new HELLO program.
You will note that HELLO.EXE executable is considerably smaller in
size than the FORTH.EXE used to create it. This illustrates one of
DX-Forth's features - turnkey applications may be saved without the
compiler and word headers. The benefit is that applications take
less disk space, are quicker to load, and have more free memory
available to them when they execute.
1.7 Source files
Forth has traditionally used 'blocks' for mass storage. Blocks may
hold any type of data including text. In DX-Forth, blocks are used
primarily to store forth program source. Each 'screen' (the name
given to blocks that hold forth text) represents 1024 bytes of data
organized as 16 lines of 64 characters each. DX-Forth screens are
saved as conventional DOS disk files and are distinguished by a .SCR
filetype (some forths use .BLK as the filetype).
DX-Forth also supports forth source in standard text files. To load
and compile such a file, use:
INCLUDE filename[.F]
If no filetype is given then .F is assumed. Another form is:
S" filename[.F]" INCLUDED ( Forth-94 Standard )
Forth source files (text or screen) may be nested to the default
maximum of 6.
1.8 Screen editor
Screen files require a special text editor. DX-Forth includes such
an editor in the form of SED.SCR. The editor is automatically
loaded and run by FORTH.EXE or FORTH-F.EXE by typing
n SED
where n is the screen number to be edited. If n is omitted and the
data stack is empty then the editor will use the last LISTed, or if
an error occured, the screen that caused the error.
If you have a slow computer or are working from a floppy disk then
it will be convenient to save a version of forth where the editor is
permanently loaded. Let's do this now.
From the DOS prompt, load forth and open SED.SCR
A>FORTH-F SED ( if no filetype is given .SCR is assumed )
Forth will boot-up with the message 'Using SED.SCR'. Alternately,
open SED.SCR from within forth with
USING SED
In DX-FORTH the most recently opened screenfile is termed the
'current' file and all screen and block commands operate on it.
CLOSE closes the 'current' screenfile. SWAP-FILE permits users
to switch between two open screenfiles.
Once SED.SCR has been opened, you may view the contents of the
file with the LIST command. 0 LIST displays screen 0, 1 LIST
displays screen 1 etc. The following shortcuts are provided:
L ( -- ) (L)ist the current screen
N ( -- ) list the (N)ext screen
B ( -- ) list the previous screen i.e. (B)ack
LS ( -- ) (S)wap screenfiles and (L)ist
Line 0 of each screen is called the index line and traditionally
contains a comment indicating the contents of the screen. Typing
0 QX
displays a 'quick index' of 60 screens beginning at screen 0.
To list screens to a printer one could use
PRINTER 0 LIST 1 LIST 2 LIST CONSOLE
or more simply
0 2 SHOW
which prints screens 0 to 2 at three screens per page.
To print all the screens in a source file, type
LISTING
Now compile the editor into the dictionary with
1 LOAD
Once loading has completed, typing WORDS will show new commands have
been added to the dictionary. In addition, FYI reveals some system
memory has been consumed and there is now a new vocabulary in addition
to FORTH - the EDITOR vocabulary. If you are curious to see what is
in the EDITOR vocabulary, type
EDITOR WORDS
Now that the editor has been loaded, let's make it permanent by saving
it and the current contents of the forth dictionary as a new executable.
But before doing that you may prefer to use the name EDIT instead of
SED. That's easily done by creating a synonym e.g.
AKA SED EDIT
You can now use either SED or EDIT to invoke the screen editor.
Let's finish saving our custom version of DX-Forth to disk.
SAVE DX.EXE ( if no filetype is given .EXE is assumed )
Note: DX-Forth comes supplied with DX.EXE so you can omit the above
step if you wish.
For details on using the editor, refer to the SED.TXT documentation
file.
1.9 Resident text file editor
DX-Forth includes TED - a simple text file editor. As with the screen
editor, text source files may be edited without leaving the forth
environment. See TED.TXT for further information.
1.10 Command-line interface
DX-Forth allows file opening and command processing from the DOS command
line. The syntax is:
A:> FORTH item1 item2 ... itemn
where:
item1 filename to be opened (assumed suffix is .SCR)
item2...itemn forth command(s) to be executed
Once the command sequence is completed, the DX-Forth sign-on message
appears and control passes to the user.
To bypass file opening, replace item1 with a '-' character.
Including BYE at the end of the command sequence will cause an immediate
return to DOS. This can be very useful and allows use of the forth
compiler within DOS batch files.
1.11 Machine code assembler
Although threaded-code forth generates code that is compact and quite
fast - up to 10 times faster than interpreted BASIC - there may be
occasion when the full speed of machine code is required.
The assembler provided with DX-Forth allows writing of forth 'code'
words. Code words are simply machine language routines that end with
a jump to NEXT. Documentation for the assembler may be found in the
file ASM.TXT.
1.12 Increasing System space
The FORTH and FORTH-F executables are supplied with tools and assembler
installed. If either are not required, the System dictionary space may
be increased accordingly. To facilitate this, two marker words are
provided:
-TOOLS removes the tools and all subsequent words.
-ASM removes the assembler and all subsequently defined words.
E.g. To remove TOOLS type the following:
CHECKING OFF FORGET -TOOLS CHECKING ON
Note: As of DX-Forth 3.3, word headers are stored in their own segment
rather than in the System dictionary. Consequently there is now much
less need to conserve System dictionary space.
1.13 Further suggestions
If you have worked your way through the previous sections, you now
know your way around DX-Forth - how to list and compile forth screen
files, save new versions of forth and create turnkey applications.
If this is your first encounter with forth, I hope this brief tour
through DX-Forth will encourage you to look further. Get a book on
forth and learn it - forth really is EASY!
The best way to learn forth (or any language) is by studying examples.
Several simple applications have been provided with DX-Forth. When
you encounter a forth word which is unfamiliar, find its definition
in the Forth-94 Standard, or the DX-Forth glossary if not a Standard
word.
A sample filecopy program FCOPY is provided in source form. As well
as illustrating a complete forth application, it also serves as a
primer on using DX-Forth's file functions. It will show you how to:
- get arguments from the DOS command line
- create file-handles and assign file-buffers
- open disk files
- read data from a disk file
- write data to a disk file
- close disk files
- handle errors
Routines may be extracted for your own use or the entire program can
serve as the basis for a more complex one.
NEWAPP.SCR is a skeletal program that allows users to quickly develop
DOS applications. Using DOSLIB.SCR it provides access to DOS functions
and routine tasks such as command-line parsing and buffered I/O. See
NEWAPP.TXT for details.
1.14 Error messages
Compiler error messages
-----------------------
"block out of range" Attempt to access a block past end of
file.
"block r/w error" Error encountered during a block read or
write operation.
"no file open" File operation was requested but no file
was open.
"can't open file" File not found or write-protected.
"can't create file" Existing file write-protected or disk full.
"can't delete file" File not found or write-protected.
"can't resize file" File not found or write-protected.
"can't rename file" File exists, not found or write-protected.
"can't save file" Error occurred during save (probably disk
full).
"compilation only" Use only during compilation.
"execution only" Use only during execution.
"loading only" Use only during loading.
"definition unbalanced" Definition is not properly formed e.g.
conditional statements (IF ELSE THEN etc)
were incorrectly used or the data stack level
changed.
"is protected" Word is located in PROTECTed dictionary.
"is alias" Operation on alias not allowed e.g. FORGET.
"invalid name" Word name length outside the range 1 to 31
characters.
"specify filename" A filename is required but none was given.
"too many files" Exceeded maximum number of open source files.
"is redefined" Definition with the same name already exists.
Note: this is a warning - not an error.
"is system" A System word is being compiled into the
Application dictionary. See section 2.2
Note: aliases will be displayed using the
primary name.
"is undefined" Word could not be found in the dictionary
using the current search order, or was not
a valid number.
"no name space" Header dictionary full.
"stack?" Data stack under/overflow.
"r-stack?" Return stack under/overflow.
"f-stack?" Floating point stack under/overflow.
"invalid chain" Illegal CHAIN argument. See glossary.
Run-time error messages
-----------------------
Apart from those listed below, DX-Forth does not perform run-time error
checking. It is the responsibility of the application programmer to
include error checking appropriate to the task.
"HOLD buffer overflow" The string being built in the HOLD buffer
exceeded the maximum size.
"uninitiated DEFER" A DEFERed word was defined but never
initialized with IS.
"exception = [n]" Exception error code n was executed. See
section 2.14 for a list of system and DOS
codes. Application-defined error codes are
typically represented by a positive number.
"no data space" Data space or dictionary full.
"not enough RAM" Insufficient DOS memory.
"wrong DOS version" Requires DOS version 2.x or later.
Assembler error messages
------------------------
"definition unbalanced" Definition is not properly formed.
"duplicate label" Label number was previously used.
"execution only" Word may be used only during execution.
"invalid label" Incorrect label number or too many labels
used.
"branch out of range" Exceeded the range of a short relative
branch (128 bytes).
"too many references" Exceeded the maximum number of forward
references to labels.
"unresolved reference" A label was referenced but never defined.
2. Programming reference
This section contains programming and technical information specific
to DX-Forth.
2.1 File system
DX-Forth uses FORTH-94 disk file management.
2.2 Application and System words
When a word is compiled into DX-Forth, it is added to either the
Application dictionary or the System dictionary.
The above suggests that DX-Forth uses two dictionaries. In reality,
there is one dictionary physically divided into two parts. It is this
physical partitioning that enables DX-Forth to generate small turnkey
applications, free of compiler overhead.
Executing the words APPLICATION or SYSTEM causes all subsequent
definitions to be compiled into the corresponding dictionary segment.
The word FYI shows the current compilation dictionary and statistics.
The 'application' dictionary contains words (less their headers) that
are available for use by either TURNKEY applications or by the forth
compiler.
The 'system' dictionary contains words that are used exclusively by the
forth compiler. Headers of forth words are located in their own
segment. System words and headers are NOT saved during the generation
of TURNKEY applications.
To see which words are System or Application, type WORDS. If the word
is displayed with a bold attribute (usually blue), then it resides in
the System dictionary otherwise it resides in the Application dictionary.
Compiling SYSTEM words
Under no circumstances should an application compiled with TURNKEY be
allowed to execute a System word. Attempting to do so will result in
unpredictable behaviour and failure of the application.
To assist users from inadvertently compiling System words into TURNKEY
applications, DX-Forth will issue a warning message should this be
attempted (assuming WARNING has not been disabled).
Applications saved with TURNKEY-SYSTEM may safely ignore System warnings
as the entire forth dictionary including compiler and headers is saved.
Spurious SYSTEM warnings
It is possible to receive a System warning message that is neither an
error condition, nor results in failure of the turnkey application.
Typically it occurs during the compilation of defining words e.g.
APPLICATION WARNING ON
: BYTE-CONSTANT
CREATE C, DOES> C@ ;
Compiling the above causes the following message to appear
"CREATE is system C, is system (;CODE) is system"
DX-Forth is warning the user that words CREATE C, (;CODE) are System
words and are being compiled into the Application dictionary.
The reason this will NOT cause the application to fail is that the
words between CREATE and DOES> inclusive represent the "compiling" part
of the defining word. This part is executed only during compilation
- never when the application is run.
To disable spurious System warning messages one may use WARNING OFF or
precede the offending definition with -? which will turn off WARNING
for that definition only.
Tip: For an alternative way of creating defining words which avoids the
peculiarities of CREATE ... DOES> see BUILD in the glossary.
2.3 Executing applications
Applications can often be fully tested and debugged from within the
forth environment. However when they are eventually TURNKEYed and
executed from the DOS command-line, there will be differences of which
the programmer should be aware:
- The amount of unused memory available to an application will vary
depending on whether it is run from within forth or from the DOS
command-line. UNUSED may be used by applications to determine how
much free memory is currently available.
- SET-LIMIT allows the programmer to specify a top-of-memory address
or LIMIT for the application. The effect of SET-LIMIT is postponed
until the turnkey application is executed.
- The memory region at 5Ch and 80h (DOS default FCB and DMA buffer) is
overwritten by the forth compiler during DIR, RENAME, INCLUDE etc.
Otherwise, this region is unaffected and may be used by turnkey
applications to interrogate the DOS command-line.
2.4 No Warm-Boot option
Not applicable to the MS-DOS version of DX-Forth.
2.5 User patch area
Not applicable to the MS-DOS version of DX-Forth.
2.6 Overlays
As DX-Forth resides in a single 64K segment, there will be a limit on
the size of applications that may be compiled. If larger applications
are needed this can often be achieved with overlays.
Using overlays will require a little more planning of the application.
Some important aspects the programmer must consider are listed below.
- The resident part of the program must ensure that the correct overlay
is in memory before executing an overlay word.
- An overlay must not execute words that exist in other overlays.
- An overlay must not execute words in the resident part, which in
turn, execute words in a different overlay.
See OVERLAY.SCR for a demonstration of a simple overlay system.
2.7 Multitasking
A co-operative 'round robin' multi-tasker is provided with DX-Forth.
It permits an application to have several tasks run concurrently.
Refer to the multitasker documentation MULTI.TXT and the source file
MULTI.SCR for further details.
2.8 User variables
In common with most forth systems, DX-Forth has 'user' variables. User
variables occupy a common region in memory. They hold various system
and boot up values and are also used for multi-tasking applications.
In DX-Forth the default size of the user area is 128 bytes. User
variables are defined as follows:
44 USER VAR1
46 USER VAR2
50 USER VAR3 ...
The number preceding USER is the offset in bytes of the variable from
the user base address (given by the variable UP). Offsets beginning
with 44 decimal are available to applications. In the above example,
VAR1 occupies 2 bytes (1 cell) at offset 44, VAR2 occupies 4 bytes
(2 cells) at offset 46 etc. See #USER in the glossary.
As with normal variables, executing the name of a user variable returns
its address. Unlike normal variables, the literal value of the address
may differ at compile and run time. In multi-tasking applications the
contents of a user variable may differ between tasks.
Predefined user variables in DX-Forth are:
S0 R0 DP VOC-LINK FS0 DPH DPL BASE OUT CATCHER
2.9 System vectors
SYS-VEC returns the address of the system vector and parameter table.
The table contains default values used by the system. Applications
may alter the vectors and values in the table as needed. Note that
some changes will not take effect until COLD is executed. Refer to
SYS-VEC in the glossary document for details.
2.10 Deferred words
The following is a list of DX-Forth words built with DEFER IS .
BEEP FIND MS PAUSE REFILL ACCEPT SOUND
The current action of a deferred word may be obtained using:
' >BODY @ ( "name" -- xt ) or
ADDR @ ( "name" -- xt )
2.11 Search order
The dictionary search order is CONTEXT CURRENT FORTH where each
represents a vocabulary or "wordlist". Complex search orders are
possible using the CHAIN command.
2.12 Compiler security
DX-Forth includes compiler security to detect malformed definitions
and constructs e.g. failing to terminate an IF section with a THEN.
Compiler security words used by DX-Forth are listed in the glossary.
How and when to use them is a topic of its own and is not discussed
here (see the DX-Forth source files for examples of use).
It is sometimes useful to disable balance checking in high-level or
code definitions. This may be done by setting variable CHECKING
to false (i.e. zero).
2.13 Exception handling
CATCH THROW provide a mechanism for handling errors conditions within
a program.
It is recommended that applications use only positive THROW codes.
Exception values in the range -1 to -4095 are reserved by ANS-FORTH
for use by the system. See: "Exception codes"
2.14 Exception codes
DX-Forth implements only a subset of ANS-FORTH Standard exception
codes. Codes in the range -257 to -511 are reserved for DOS related
errors.
DX-Forth exception codes:
0 no error
-1 ABORT
-2 ABORT"
-256 reserved
-257 to -511 DOS error code
The correlation between DOS error code and DX-Forth exception code
is given below:
Forth DOS
0 0 no error
-511 1 invalid function number
-510 2 file not found
-509 3 path not found
-508 4 too many open files
-507 5 access denied
-506 6 invalid handle
-505 7 memory control block destroyed
-504 8 insufficient memory
-503 9 memory block address invalid
-502 10 environment invalid
-501 11 format invalid
-499 12 access code invalid
-498 13 data invalid
-497 14 reserved
-496 15 invalid drive
-495 16 attempted to remove current directory
-494 17 not same device
-493 18 no more files
... ...
-257 255 unspecified error e.g. disk full
Note: To convert an exception code in the range -257 to -511 to its
corresponding DOS error code, use: 255 AND
2.15 Key codes
DX-Forth supports IBM-PC extended keystrokes and enhanced keyboards.
For ease of use, two-byte extended keystrokes are returned as single
values. The codes below are for an enhanced 101-key US keyboard.
Ascii codes 32-126 are not shown.
Key Code Key Code Key Code
---- ----- ---- ----- ---- ------
00 0 Alt F A1 161 Ctrl F7 E4 228
Ctrl A 01 1 Alt G A2 162 Ctrl F8 E5 229
Ctrl B 02 2 Alt H A3 163 Ctrl F9 E6 230
Ctrl C 03 3 Alt J A4 164 Ctrl F10 E7 231
Ctrl D 04 4 Alt K A5 165 Alt F1 E8 232
Ctrl E 05 5 Alt L A6 166 Alt F2 E9 233
Ctrl F 06 6 Alt ; A7 167 Alt F3 EA 234
Ctrl G 07 7 Alt ' A8 168 Alt F4 EB 235
Ctrl H 08 8 Alt ` A9 169 Alt F5 EC 236
Ctrl I 09 9 AA 170 Alt F6 ED 237
Ctrl J 0A 10 Alt \ AB 171 Alt F7 EE 238
Ctrl K 0B 11 Alt Z AC 172 Alt F8 EF 239
Ctrl L 0C 12 Alt X AD 173 Alt F9 F0 240
Ctrl M 0D 13 Alt C AE 174 Alt F10 F1 241
Ctrl N 0E 14 Alt V AF 175 Ctrl Prtsc F2 242
Ctrl O 0F 15 Alt B B0 176 Ctrl Left F3 243
Ctrl P 10 16 Alt N B1 177 Ctrl Right F4 244
Ctrl Q 11 17 Alt M B2 178 Ctrl End F5 245
Ctrl R 12 18 Alt , B3 179 Ctrl PgDn F6 246
Ctrl S 13 19 Alt . B4 180 Ctrl Home F7 247
Ctrl T 14 20 Alt / B5 181 Alt 1 F8 248
Ctrl U 15 21 B6 182 Alt 2 F9 249
Ctrl V 16 22 * Alt * B7 183 Alt 3 FA 250
Ctrl W 17 23 B8 184 Alt 4 FB 251
Ctrl X 18 24 B9 185 Alt 5 FC 252
Ctrl Y 19 25 BA 186 Alt 6 FD 253
Ctrl Z 1A 26 F1 BB 187 Alt 7 FE 254
Ctrl [ 1B 27 F2 BC 188 Alt 8 FF 255
Ctrl \ 1C 28 F3 BD 189 Alt 9 100 256
Ctrl ] 1D 29 F4 BE 190 Alt 0 101 257
Ctrl ^ 1E 30 F5 BF 191 Alt - 102 258
Ctrl _ 1F 31 F6 C0 192 Alt = 103 259
F7 C1 193 Ctrl PgUp 104 260
Ctrl <- 7F 127 F8 C2 194 F11 105 261
80 128 F9 C3 195 F12 106 262
Alt Esc 81 129 F10 C4 196 Shift F11 107 263
82 130 C5 197 Shift F12 108 264
83 131 C6 198 Ctrl F11 109 265
84 132 Home C7 199 Ctrl F12 10A 266
85 133 Up C8 200 Alt F11 10B 267
86 134 PgUp C9 201 Alt F12 10C 268
87 135 * Alt - CA 202 Ctrl Up 10D 269
88 136 Left CB 203 * Ctrl - 10E 270
89 137 * 5 CC 204 * Ctrl _ 10F 271
8A 138 Right CD 205 110 272
8B 139 * Alt + CE 206 Ctrl Down 111 273
8C 140 End CF 207 Ctrl Ins 112 274
8D 141 Down D0 208 Ctrl Del 113 275
Alt <- 8E 142 PgDn D1 209 Ctrl Tab 114 276
Shift Tab 8F 143 Ins D2 210 Ctrl / 115 277
Alt Q 90 144 Del D3 211 * Ctrl * 116 278
Alt W 91 145 Shift F1 D4 212 Alt Home 117 279
Alt E 92 146 Shift F2 D5 213 Alt Up 118 280
Alt R 93 147 Shift F3 D6 214 Alt PgUp 119 281
Alt T 94 148 Shift F4 D7 215 11A 282
Alt Y 95 149 Shift F5 D8 216 Alt Left 11B 283
Alt U 96 150 Shift F6 D9 217 11C 284
Alt I 97 151 Shift F7 DA 218 Alt Right 11D 285
Alt O 98 152 Shift F8 DB 219 11E 286
Alt P 99 153 Shift F9 DC 220 Alt End 11F 287
Alt [ 9A 154 Shift F10 DD 221 Alt Down 120 288
Alt ] 9B 155 Ctrl F1 DE 222 Alt PgDn 121 289
Alt Enter 9C 156 Ctrl F2 DF 223 Alt Ins 122 290
9D 157 Ctrl F3 E0 224 Alt Del 123 291
Alt A 9E 158 Ctrl F4 E1 225 * Alt / 124 292
Alt S 9F 159 Ctrl F5 E2 226 Alt Tab 125 293
Alt D A0 160 Ctrl F6 E3 227 * Alt Enter 126 294
(*) on keypad
Note:
- Codes 261 and above are only available on AT-class machines
fitted with an enhanced keyboard
- DOS versions prior to 4.0 do not support enhanced keys
irrespective of the hardware

562
DX-FORTH v430/DXFORTH.WDS Normal file
View File

@ -0,0 +1,562 @@
!
!CSP
!L
#
#>
#S
#SCREENS
#USER
'
'AH
'AX
'BH
'BP
'BX
'CH
'CX
'DH
'DI
'DS
'DX
'ES
'FLAGS
'NEXT
'SI
'SOURCE
(
(*
(.)
(;CODE)
(D.)
(F.)
(FE.)
(FS.)
(G.)
(NAME)
(U.)
*
*/
*/MOD
+
+!
+EXT
+LOOP
+STRING
,
,"
-
-->
-1
-?
-ALLOT
-ASM
-BLANKS
-EXT
-FP
-PATH
-ROLL
-ROT
-TASK
-TOOLS
-TRAILING
.
."
.(
.FREE
.ID
.NAME
.R
.S
.VOC
/
/MOD
/MS
/PARSE
/STRING
0
0<
0<>
0=
0>
1
1+
1-
2
2!
2!L
2*
2+
2-
2/
2>R
2@
2@L
2CONSTANT
2DROP
2DUP
2LITERAL
2NIP
2OVER
2R>
2R@
2ROT
2SWAP
2VARIABLE
3
:
:NONAME
;
;C
;CODE
<
<#
<>
<RESOLVE
=
>
><
>BODY
>FLOAT
>FNAME
>IN
>MARK
>NUMBER
>R
?
?BAL
?BLOCK
?COMP
?CSP
?DO
?DUP
?EXEC
?STACK
@
@EXECUTE
@L
ABORT
ABORT"
ABS
ACCEPT
ADDR
AGAIN
AHEAD
AKA
ALIGN
ALIGNED
ALLOT
AND
APPLICATION
ASSEMBLER
AT-XY
ATTRIB
B
B/BUF
BACKGROUND
BAL
BASE
BEEP
BEGIN
BEHEAD
BETWEEN
BIN
BINARY
BIOS-IO
BL
BLANK
BLK
BLOCK
BOLD
BOUNDS
BRIGHT
BUFFER
BUILD
BYE
C!
C!L
C,
C/L
C@
C@L
CAPS
CASE
CATCH
CATCHER
CELL+
CELL-
CELLS
CHAIN
CHAR
CHAR+
CHARS
CHECKING
CLEAR-LINE
CLOSE
CLOSE-ALL
CLOSE-FILE
CMDTAIL
CMOVE
CMOVE>
CMOVEL
CODE
COLD
COLOR-TABLE
COMPARE
COMPILE
COMPILE,
COND
CONSOLE
CONSTANT
CONTEXT
COUNT
CR
CREATE
CREATE-FILE
CS-DROP
CS-MARK
CS-PICK
CS-POP
CS-PUSH
CS-ROLL
CS-TEST
CSEG
CSP
D+
D-
D.
D.R
D0<
D0=
D2*
D2/
D<
D=
D>F
D>S
DABS
DECIMAL
DEFER
DEFINITIONS
DELETE
DELETE-FILE
DELETE-LINE
DEPTH
DIR
DMAX
DMIN
DNEGATE
DO
DOES>
DOS-IO
DOSCALL
DOSERR?
DOSVER
DP
DPH
DPL
DROP
DU<
DUMP
DUP
DXFORTH
ELSE
EMIT
EMPTY
EMPTY-BUFFERS
END
ENDCASE
ENDOF
EOL
ERASE
EVALUATE
EXECUTE
EXIT
F!
F*
F**
F+
F,
F-
F.
F.R
F/
F0<
F0=
F0>
F<
F>
F>D
F>S
F@
FABS
FALIGN
FALIGNED
FALSE
FATAN
FCONSTANT
FCOS
FDB
FDEPTH
FDP
FDROP
FDUP
FE.
FE.R
FEXP
FILE-POSITION
FILE-SIZE
FILE-STATUS
FILEBLOCKS
FILL
FIND
FLITERAL
FLN
FLOAD
FLOAT+
FLOATS
FLOOR
FLUSH
FLUSH-FILE
FM/MOD
FMAX
FMIN
FNEGATE
FOREGROUND
FORGET
FORTH
FOVER
FPICK
FRANDOM
FROT
FROUND
FS.
FS.R
FS0
FSIN
FSP
FSQRT
FSWAP
FVARIABLE
FYI
G.
G.R
GET-CURRENT
GET-WINDOW
GET-XY
GETFILENAME
HERE
HEX
HLIMIT
HOLD
HSEG
I
I'
ICLOSE
IF
IMMEDIATE
INCLUDE
INCLUDED
INDEX
INSERT-LINE
INTCALL
INTERPRET
INVERSE
INVERT
IS
J
KEY
KEY?
L
LABEL
LAST
LASTFILE
LDUMP
LEAVE
LFILL
LIMIT
LINK,
LIST
LISTING
LITERAL
LOAD
LOADED
LOADFILE
LOADLINE
LOOP
LREAD
LS
LSHIFT
LWRITE
M*
M*/
M+
MACRO
MARKER
MAX
MAX-PRECISION
MIN
MOD
MOVE
MS
N
N>NAME
NEGATE
NHOLD
NIP
NOOP
NORMAL
NOT
NUMBER?
OF
OFF
ON
OPEN
OPEN-FILE
OR
ORDER
OUT
OVER
P!
P@
PACK
PAD
PAGE
PARSE
PATH
PAUSE
PC!
PC@
PI
PICK
PLACE
POSTPONE
PRECISION
PRINTER
PROTECT
QUIT
QX
R/O
R/W
R0
R>
R@
READ-FILE
READ-LINE
RECURSE
REFILL
REMEMBER
RENAME
RENAME-FILE
REPEAT
REPOSITION-FILE
REPRESENT
RESIZE-FILE
RETURN
ROLL
ROT
RP!
RP@
RSHIFT
S"
S,
S.R
S0
S>D
S>F
SAVE
SAVE-BUFFERS
SCAN
SCR
SCREEN?
SEARCH
SED
SET-CURRENT
SET-LIMIT
SET-PRECISION
SET-WINDOW
SHOLD
SHOW
SIGN
SKIP
SLITERAL
SM/REM
SMUDGE
SOUND
SOURCE
SP!
SP@
SPACE
SPACES
SSEG
STATE
SWAP
SWAP-FILE
SYS
SYS-VEC
SYSTEM
TED
THEN
THENS
THROW
THRU
TICKS
TO
TOKEN
TRIM
TRUE
TUCK
TURNKEY
TURNKEY-SYSTEM
TYPE
U.
U.R
U2/
U<
U>
UM*
UM/MOD
UMAX
UMIN
UNLOOP
UNNEST
UNTIL
UNUSED
UP
UPCASE
UPDATE
UPPER
USER
USING
VALUE
VARIABLE
VOC-LINK
VOCABULARY
VOCS
W/O
W>NAME
WAIT-TICK
WARNING
WHILE
WITHIN
WORD
WORDS
WORDS:
WRITE-FILE
WRITE-LINE
XOR
Y/N
ZCOUNT
ZPLACE
[
[']
[ASM
[CHAR]
[COMPILE]
[DEFINED]
[ELSE]
[IF]
[THEN]
[UNDEFINED]
\
\\
]

1
DX-FORTH v430/EXTEND.SCR Normal file
View File

@ -0,0 +1 @@
\ Extend Extend DX-Forth kernel \ Load block empty forth definitions decimal system marker -TASK ( editor stubs) : SED s" #1 FLOAD SED SED" evaluate ; : TED s" LOADLINE @ LASTFILE INCLUDE TED (TED)" evaluate ; 1 fload TOOLS 1 fload ASM application protect

92
DX-FORTH v430/F87.TXT Normal file
View File

@ -0,0 +1,92 @@
F87 - Hardware Floating-Point for DX-Forth
F87 requires an 80387 or compatible floating-point processor. Applications
compiled with F87 will check whether a suitable FPU is present and abort
with an error if none is found.
F87 models currently supported:
F87S.SCR single precision (32 bit) reals on data stack
F87D.SCR double precision (64 bit) reals on data stack
F87DS.SCR double precision (64 bit) reals on separate stack
F87X.SCR extended precision (80 bit) reals on data stack
Compile the model of your choice e.g. FORTH.EXE F87D 1 LOAD BYE
While F87 includes several IEEE 754 features such as NaN/Inf, signed-zero,
rounding modes etc. there is no attempt to be IEEE 754 compliant.
Acknowlegements:
F83 8087 FLOATING POINT 1984 by Steve Pollack
F87 Glossary:
FINIT ( -- ) Performs 80x87 FPU instruction 'finit' resetting the
FPU hardware and rounding mode to "round to nearest/
even". If a compatible FPU is not present an error
message "requires 80387+ FPU" is issued and the
application aborts. By default FINIT is executed by
COLD.
CW@ ( -- cw ) Get FPU control word
CW! ( cw -- ) Set FPU control word
SET-NEAR ( -- ) Set FPU rounding to "nearest or even" (default)
SET-FLOOR ( -- ) Set FPU rounding to "round down"
SET-CEIL ( -- ) Set FPU rounding to "round up"
SET-TRUNC ( -- ) Set FPU rounding to "round towards zero" i.e. truncate
FROUND ( r1 -- r2 ) Round to integral value using current rounding mode
FNEAR ( r1 -- r2 ) Round to integral value nearest or even
FLOOR ( r1 -- r2 ) Round to integral value nearest negative infinity
FCEIL ( r1 -- r2 ) Round to integral value nearest positive infinity
FTRUNC ( r1 -- r2 ) Round to integral value nearest zero
SIGNED-ZERO ( -- addr ) A VARIABLE which controls floating-point
negative-zero display. Default is OFF.
F0= ( r -- flag ) Return true if r is zero, or false otherwise. Does not
differentiate between positive and negative zero.
F= ( r1 r2 -- flag ) Return true if r1 and r2 are equal, or false otherwise.
Does not differentiate between positive and negative
zero.
FLOG ( r1 -- r2 ) r2 is the base-ten logarithm of r1. An ambiguous
condition exists if r1 is less than or equal to zero.
FALOG ( r1 -- r2 ) Raise ten to the power r1, giving r2.
FSIGNBIT ( r -- sign ) Return sign of r as indicated by the IEEE sign bit.
FSIGN ( r -- sign ) As for FSIGNBIT except the sign of -0.0E is determined
by variable SIGNED-ZERO.
FCLASS ( r -- +n ) Return class of floating-point number r. +n is a
positive non-zero value indicating NaN, infinite,
normal, subnormal, zero or the 80x87 conditions
unsupported and empty.
FP-NORMAL ( -- +n ) CONSTANT representing f/p finite class
FP-SUBNORMAL ( -- +n ) CONSTANT representing f/p subnormal class
FP-ZERO ( -- +n ) CONSTANT representing f/p zero class
FP-INFINITE ( -- +n ) CONSTANT representing f/p infinity class
FP-NAN ( -- +n ) CONSTANT representing f/p NaN class
+INF ( -- r ) FCONSTANT returning f/p number '+Inf'
-INF ( -- r ) FCONSTANT returning f/p number '-Inf'
+NAN ( -- r ) FCONSTANT returning f/p number '+NaN'
-NAN ( -- r ) FCONSTANT returning f/p number '-NaN'
>FLOAT ( c-addr u -- r true | false | other 1 )
Extend >FLOAT semantics to return 1 and the corresponding IEEE datum
if any of the case-insensitive strings "NaN" "Inf" "Infinity", with or
without sign, are present.
REPRESENT ( r c-addr n1 -- n2 flag1 flag2 )
In addition to the semantics for REPRESENT (see DX-Forth glossary) when
flag2=false return a string "+NAN" "-NAN" "+INF" "-INF" or "BADFLT" in
the buffer at c-addr padded with trailing blanks (BL). n2 is reserved
and flag1=sign. Rounding direction is per current rounding mode.

1
DX-FORTH v430/F87D.SCR Normal file

File diff suppressed because one or more lines are too long

1
DX-FORTH v430/F87DS.SCR Normal file

File diff suppressed because one or more lines are too long

1
DX-FORTH v430/F87S.SCR Normal file

File diff suppressed because one or more lines are too long

1
DX-FORTH v430/F87X.SCR Normal file

File diff suppressed because one or more lines are too long

1
DX-FORTH v430/FCOPY.SCR Normal file

File diff suppressed because one or more lines are too long

64
DX-FORTH v430/FILES.TXT Normal file
View File

@ -0,0 +1,64 @@
The following files are included in the DX-Forth distribution:
Executables -
FORTH.EXE DX-Forth compiler
FORTH-F.EXE DX-Forth compiler with floating point
DX.EXE FORTH-F.EXE with screen editor loaded
LISTING.BAT Make a formatted listing file from a screen file
Documentation -
WHATSNEW.TXT Summary of additions/changes/fixes
CHANGES.TXT Important changes information
DXFORTH.TXT DX-Forth documentation
DXFORTH.GLO DX-Forth glossary of non-standard words
DXFORTH.WDS DX-Forth kernel words
SED.TXT Screen file editor
TED.TXT Text file editor
ASM.TXT 8086/8087 assembler
F87.TXT 80387 floating point
OBSOLETE.TXT When old DX-Forth applications no longer compile...
MULTI.TXT Multitasker
FILES.TXT Files list
System source -
MAKEF.BAT Build DX-Forth binaries (needs Borland TASM)
MAKEF87.BAT Build 80387 floating point binaries
KERNEL.ASM MASM/TASM source for DX-Forth
EXTEND.SCR Extends kernel
TOOLS.SCR Resident extensions & utilities
ASM.SCR Forth 8086 assembler
ASM87.SCR 8087 assembler extensions
SED.SCR Screen file editor
TED.F Text file editor
Misc source -
ASMCOND.SCR Assembler structured conditionals
ASMTEST.SCR Test assembler
OBSOLETE.SCR Obsolete DX-Forth functions
MULTI.SCR Multitasker
F87D.SCR 80387 double-precision f/p
F87S.SCR 80387 single-precision f/p
F87X.SCR 80387 extended-precision f/p
F87DS.SCR 80387 double-precision f/p with separate stack
FPOUT.F Support for 80387 floating point
OVERLAY.SCR Overlay system
STRINGS.SCR Sample string package
FCOPY.SCR Sample filecopy utility
TXT2BLK.SCR Text to block conversion utility
BLK2TXT.SCR Block to text conversion utility
BREAKGO.SCR Debugging utility
MISC.SCR Miscellaneous function library
SHOW.SCR Print source files 6 screens per page
SSED.SCR Create stand-alone screen editor
NEWAPP.SCR Skeletal MS-DOS application
DOSLIB.SCR Function library and NEWAPP support
STKCHK.SCR Stack balance check utility
LFN.SCR Long filename support for Windows 95
LOCALS.SCR ANS locals
HLOCALS.SCR Hayes locals extension
MISER.SCR Miser Case extensions & demo

24
DX-FORTH v430/FILE_ID.DIZ Normal file
View File

@ -0,0 +1,24 @@
DX-Forth 4 - Forth compiler for MS-DOS
--------------------------------------
DX-Forth is a Forth language compiler and development system
for MS-DOS 2.x and compatible disk operating systems. It is
intended to be a complete, easy to use, programming tool for
the creation of DOS applications.
Features include:
- ANS FORTH Standard (FORTH-94) *
- Fast direct-threaded code
- Generate turnkey applications without compiler overhead
- Fast floating point and trigonometric functions
- Forth-94 file I/O
- DOSLIB application library
- Multitasking
- ANS locals
- Overlays for large applications
- 8086/87 Forth assembler for CODE words
- Full source code included
* DX-FORTH 4 generally follows the FORTH-94 Standard but
does not seek to be strictly compliant.

BIN
DX-FORTH v430/FORTH-F.EXE Normal file

Binary file not shown.

BIN
DX-FORTH v430/FORTH.EXE Normal file

Binary file not shown.

451
DX-FORTH v430/FPOUT.F Normal file
View File

@ -0,0 +1,451 @@
\
\ FPOUT.F version 3.10
\
\ A Forth floating-point output words package
\
\ Main words:
\
\ Compact Formatted String
\ ------- --------- ------
\ FS. FS.R (FS.) Scientific
\ FE. FE.R (FE.) Engineering
\ F. F.R (F.) Floating-point
\ G. G.R (G.) General
\
\ FDP ( -- a-addr )
\
\ A variable controlling decimal point display. If the
\ contents are zero then trailing decimal points are
\ not shown. If non-zero (default) the decimal point is
\ displayed.
\
\ FECHAR ( -- c-addr )
\
\ A character variable containing the output character
\ used to indicate the exponent. Default is 'E'.
\
\ FEDIGITS ( -- a-addr )
\
\ A variable containing the minimum number of exponent
\ digits to display in formatted output mode. Default
\ value is 2, minimum is 1. Does not affect compact
\ output mode.
\
\ MAX-PRECISION ( -- n )
\
\ A constant returning the implementation-defined
\ maximum precision. Equivalent to the value returned
\ by the environment-query string MAX-FLOAT-DIGITS.
\
\ Notes:
\
\ Output words which specify the number of places after
\ the decimal point may use the value -1 to force compact
\ mode.
\
\ In compact mode non-essential zeros and signs are
\ removed and the number of significant digits output is
\ limited to MAX-PRECISION digits. FS. FE. F. G. operate
\ in compact mode.
\
\ In formatted mode the number of decimal places output
\ is fixed and PRECISION has no effect.
\
\ The character string returned by (FS.) (FE.) (F.) (G.)
\ resides in the pictured-numeric output area.
\
\ An ambiguous condition exists if: BASE is not decimal;
\ character string exceeds pictured-numeric output area;
\ PRECISION returns a value less than one or greater
\ than MAX-FLOAT-DIGITS.
\
\ For use with separate or common stack floating-point
\ Forth models.
\
\ This code is PUBLIC DOMAIN. Use at your own risk.
\
\ *****************************************************
\ This version of FPOUT requires REPRESENT conform to
\ the specification proposed here:
\
\ ftp://ftp.taygeta.com/pub/Forth/Applications/ANS/
\ Represent_33.txt (2014-03-17)
\
\ If your Forth does not have a compliant REPRESENT
\ then use FPOUT v2.2 instead.
\ *****************************************************
\
\ History:
\
\ 3.1 2006-11-13 es Demo for REPRESENT proposal.
\ 3.2 2007-06-05 es Changed default to trailing
\ decimal point on.
\ 3.3 2007-11-19 es Add FECHAR FEDIGITS. Fix zero
\ sign in (F.) F.R
\ 3.4 2008-01-23 es Updated to REPRESENT spec 2.1
\ 3.5 2010-12-05 es Updated to REPRESENT spec 3.0
\ 3.6 2011-02-06 es Changed FECHAR storage from
\ cell to character.
\ 3.7 2011-02-16 es Renamed mp# to MAX-PRECISION.
\ Removed effect of PRECISION in
\ formatted mode.
\ 3.8 2011-05-25 es Fixed log(0) in (f1)
\ 3.9 2012-05-20 es Range check FEDIGITS PRECISION.
\ FEDIGITS minimum changed to 1.
\ 3.10 2014-06-06 es Factor out S.R SHOLD NHOLD. No
\ functional change.
CR .( Loading FPOUT 3.10 2014-06-06 ... ) CR
DECIMAL
\ Useful tools which exist in some Forth systems albeit
\ under different names
[UNDEFINED] DXFORTH [IF]
\ type string right-justified
: S.R ( c-addr u width -- )
OVER - SPACES TYPE ;
\ HOLD string
: SHOLD ( c-addr u -- )
BEGIN DUP WHILE 1- 2DUP CHARS + C@ HOLD
REPEAT 2DROP ;
\ HOLD n characters
: NHOLD ( n char -- )
SWAP 0 ?DO DUP HOLD LOOP DROP ;
[THEN]
\ Compile application
CREATE FDP 2 CELLS ALLOT
CREATE FECHAR 1 CHARS ALLOT
VARIABLE FEDIGITS
\ ****************** USER OPTIONS *******************
1 FDP ! \ trailing decimal point
2 FEDIGITS ! \ minimum exponent digits
CHAR E FECHAR C! \ output character for exponent
\ *****************************************************
[DEFINED] DXFORTH [IF] #fdigits ( n) [ELSE]
S" MAX-FLOAT-DIGITS" ENVIRONMENT? 0= [IF]
CR .( MAX-FLOAT-DIGITS not found ) ABORT
[THEN] ( n)
[THEN]
\ Maximum PRECISION
( n) CONSTANT MAX-PRECISION
\ Define SET-PRECISION PRECISION if not present
[UNDEFINED] SET-PRECISION [IF]
\ Return the number of significant digits currently used
\ by F. FE. FS. G.
MAX-PRECISION VALUE PRECISION
\ Set the number of significant digits currently used by
\ F. FE. FS. G.
: SET-PRECISION ( +n -- )
1 MAX MAX-PRECISION MIN TO PRECISION ;
[THEN]
MAX-PRECISION SET-PRECISION \ set to maximum
[DEFINED] DXFORTH [IF] MAX-PRECISION ( n) [ELSE]
S" REPRESENT-CHARS" ENVIRONMENT?
0= [IF] MAX-PRECISION [THEN] ( n )
[THEN]
( n ) CONSTANT mc# \ max chars output from REPRESENT
CREATE fbuf mc# CHARS ALLOT
0 VALUE ex# \ exponent
0 VALUE sn# \ sign
0 VALUE ef# \ exponent factor 1=FS. 3=FE.
0 VALUE pl# \ +n places right of decimal point
\ -1 compact display
\ get exponent
: (f1) ( F: r -- r ) ( -- exp )
FDUP [UNDEFINED] FLOG [IF]
fbuf MAX-PRECISION REPRESENT NIP AND
[ELSE]
F0= IF 1 ELSE FDUP
FABS FLOG FLOOR F>D D>S 1+ THEN
[THEN] ;
\ apply exponent factor
: (f2) ( exp -- offset exp2 )
S>D ef# FM/MOD ef# * ;
\ float to character string
: (f3) ( F: r -- ) ( places -- c-addr u flag )
DUP TO pl# 0< IF
PRECISION
ELSE
(f1) ef# 0> IF 1- (f2) DROP 1+ THEN pl# +
THEN MAX-PRECISION MIN fbuf SWAP REPRESENT >R
TO sn# TO ex# fbuf mc# -TRAILING R> <# ;
\ insert exponent
: (f4) ( exp -- )
DUP ABS S>D pl# 0< 0= DUP >R IF FEDIGITS @
1 MAX 1 ?DO # LOOP THEN #S 2DROP DUP SIGN 0< 0=
R> AND IF [CHAR] + HOLD THEN FECHAR C@ HOLD ;
\ conditionally set flag
: (f5) ( n -- +n|0 )
0 MAX DUP FDP CELL+ +! ;
\ insert string
: (f6) ( c-addr n -- )
(f5) SHOLD ;
\ insert '0's
: (f7) ( n -- )
(f5) [CHAR] 0 NHOLD ;
\ insert sign
: (f8) ( -- )
sn# SIGN 0 0 #> ;
\ trim trailing '0's
: (f9) ( c-addr u1 -- c-addr u2 )
pl# 0< IF
BEGIN DUP WHILE 1- 2DUP CHARS +
C@ [CHAR] 0 - UNTIL 1+ THEN
THEN ;
: (fa) ( n -- n n|pl# )
pl# 0< IF DUP ELSE pl# THEN ;
\ insert fraction string n places right of dec. point
: (fb) ( c-addr u n -- )
0 FDP CELL+ !
>R (f9) R@ +
(fa) OVER - (f7) \ trailing 0's
(fa) MIN R@ - (f6) \ fraction
R> (fa) MIN (f7) \ leading 0's
FDP 2@ OR IF
[CHAR] . HOLD
THEN ;
\ split string into integer/fraction parts at n and insert
: (fc) ( c-addr u n -- )
>R 2DUP R@ MIN 2SWAP R> /STRING 0 (fb) (f6) ;
\ exponent form
: (fd) ( F: r -- ) ( n factor -- c-addr u )
TO ef# (f3) IF ex# 1- (f2) (f4) 1+ (fc) (f8) THEN ;
\ Main words
\ Convert real number r to a string c-addr u in scientific
\ notation with n places right of the decimal point.
: (FS.) ( F: r -- ) ( n -- c-addr u )
1 (fd) ;
\ Display real number r in scientific notation right-
\ justified in a field width u with n places right of the
\ decimal point.
: FS.R ( F: r -- ) ( n u -- )
>R (FS.) R> S.R ;
\ Display real number r in scientific notation followed by
\ a space. Non-essential zeros and signs are removed.
: FS. ( F: r -- )
-1 0 FS.R SPACE ;
\ Convert real number r to a string c-addr u in engineering
\ notation with n places right of the decimal point.
: (FE.) ( F: r -- ) ( n -- c-addr u )
3 (fd) ;
\ Display real number r in engineering notation right-
\ justified in a field width u with n places right of the
\ decimal point.
: FE.R ( F: r -- ) ( n u -- )
>R (FE.) R> S.R ;
\ Display real number r in engineering notation followed
\ by a space. Non-essential zeros and signs are removed.
: FE. ( F: r -- )
-1 0 FE.R SPACE ;
\ Convert real number r to string c-addr u in fixed-point
\ notation with n places right of the decimal point.
: (F.) ( F: r -- ) ( n -- c-addr u )
0 TO ef# (f3) IF
ex# DUP mc# > IF
fbuf 0 ( dummy ) 0 (fb)
mc# - (f7) (f6)
ELSE
DUP 0> IF
(fc)
ELSE
ABS (fb) 1 (f7)
THEN
THEN (f8)
THEN ;
\ Display real number r in fixed-point notation right-
\ justified in a field width u with n places right of the
\ decimal point.
: F.R ( F: r -- ) ( n u -- )
>R (F.) R> S.R ;
\ Display real number r in floating-point notation followed
\ by a space. Non-essential zeros and signs are removed.
: F. ( F: r -- )
-1 0 F.R SPACE ;
\ Convert real number r to string c-addr u with n places
\ right of the decimal point. Fixed-point is used if the
\ exponent is in the range -4 to 5 otherwise use scientific
\ notation.
: (G.) ( F: r -- ) ( n -- c-addr u )
>R (f1) [ -4 1+ ] LITERAL [ 5 2 + ] LITERAL WITHIN
R> SWAP IF (F.) ELSE (FS.) THEN ;
\ Display real number r right-justified in a field width u
\ with n places right of the decimal point. Fixed-point is
\ used if the exponent is in the range -4 to 5 otherwise
\ use scientific notation.
: G.R ( F: r -- ) ( n u -- )
>R (G.) R> S.R ;
\ Display real number r followed by a space. Floating-point
\ is used if the exponent is in the range -4 to 5 otherwise
\ use scientific notation. Non-essential zeros and signs are
\ removed.
: G. ( F: r -- )
-1 0 G.R SPACE ;
CR FDP @ [IF]
CR .( Decimal point always displayed. Use 0 FDP ! )
CR .( or FDP OFF to disable trailing decimal point. )
[ELSE]
CR .( Trailing decimal point not displayed. Use )
CR .( 1 FDP ! or FDP ON for FORTH-94 compliance. )
[THEN] CR
[DEFINED] DXFORTH [IF] BEHEAD mc# (fd) [THEN]
\ ****************** DEMONSTRATION ******************
0 [IF]
CR .( Loading demo words... ) CR
CR .( TEST1 formatted, n decimal places )
CR .( TEST2 compact & right-justified )
CR .( TEST3 display FS. )
CR .( TEST4 display F. )
CR .( TEST5 display G. )
CR .( TEST6 display 8087 non-numbers ) CR
CR .( 'n PLACES' sets decimal places for TEST1. )
CR .( SET-PRECISION sets maximum significant )
CR .( digits displayable. )
CR CR
[UNDEFINED] F, [IF]
: F, ( r -- ) HERE 1 FLOATS ALLOT F! ;
[THEN]
\ floating-point numbers array
FALIGN HERE ( *)
1.23456E-16 F,
-1.23456E-11 F,
1.23456E-7 F,
-1.23456E-6 F,
1.23456E-5 F,
-1.23456E-4 F,
1.23456E-3 F,
-1.23456E-2 F,
1.23456E-1 F,
-0.E0 F,
1.23456E+0 F,
-1.23456E+1 F,
1.23456E+2 F,
-1.23456E+3 F,
1.23456E+4 F,
-1.23456E+5 F,
1.23456E+6 F,
-1.23456E+7 F,
1.23456E+11 F,
-1.23456E+16 F,
( *) HERE OVER - 1 FLOATS / CONSTANT #numbers
( *) CONSTANT f-array
: do-it ( xt -- )
#numbers 0 DO
f-array FALIGNED I FLOATS +
OVER >R F@ CR R> EXECUTE
LOOP DROP ;
2VARIABLE (dw)
: d.w ( -- dec.places width ) (dw) 2@ ;
: PLACES ( places -- ) d.w SWAP DROP (dw) 2! ;
: WIDTH ( width -- ) d.w DROP SWAP (dw) 2! ;
5 PLACES 18 WIDTH
: (t1) ( r -- )
FDUP d.w FS.R FDUP d.w F.R FDUP d.w G.R d.w FE.R ;
: TEST1 ( -- )
CR ." TEST1 right-justified, formatted ("
d.w DROP 0 .R ." decimal places)" CR
['] (t1) do-it CR ;
: (t2) ( r -- )
FDUP -1 d.w NIP FS.R FDUP -1 d.w NIP F.R
FDUP -1 d.w NIP G.R -1 d.w NIP FE.R ;
: TEST2 ( -- )
CR ." TEST2 right-justified, compact" CR
['] (t2) do-it CR ;
: TEST3 ( -- )
CR ." TEST3 FS."
CR ['] FS. do-it CR ;
: TEST4 ( -- )
CR ." TEST4 F."
CR ['] F. do-it CR ;
: TEST5 ( -- )
CR ." TEST5 G."
CR ['] G. do-it CR ;
: TEST6 ( -- )
PRECISION >R 1 SET-PRECISION
CR ." TEST6 8087 non-numbers PRECISION = 1" CR
CR 1.E0 0.E0 F/ FDUP G.
CR FNEGATE G.
CR 0.E0 0.E0 F/ FDUP G.
CR FNEGATE G.
CR
R> SET-PRECISION ;
[ELSE]
CR .( To compile demonstration words TEST1..TEST6 )
CR .( enable conditional in FPOUT source. ) CR
[THEN]
\ end

View File

@ -0,0 +1 @@
\ Hayes-style locals Adapted from: http://www.complang.tuwien.ac.at/forth/anslocal.fs \ Hayes-style locals [undefined] (local) [if] 1 fload locals [then] forth definitions system -? : lp >in @ swap token 2dup s" --" compare if 2dup s" }" compare over 0> and if s" |" compare 0= or false else true then else [char] } parse 2drop true then if 2drop 2drop >in @ end dup if false postpone literal then recurse swap >in ! token (local) ; : { false lp >in ! 0 0 (local) ; immediate application behead lp lp

9838
DX-FORTH v430/KERNEL.ASM Normal file

File diff suppressed because it is too large Load Diff

1
DX-FORTH v430/LFN.SCR Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,7 @@
echo off
echo Usage: LISTING screenfile output
if "%1"=="" goto end
if "%2"=="" goto end
forth %1 :noname 'DX c! 2 doscall ; sys-vec 8 + ! listing bye >%2
echo done!
:end

1
DX-FORTH v430/LOCALS.SCR Normal file

File diff suppressed because one or more lines are too long

12
DX-FORTH v430/MAKEF.BAT Normal file
View File

@ -0,0 +1,12 @@
rem opts: NOFLOAT NOFSTACK FLOORED NOHIDE
rem opts: EMS= HMS= SMS= FILES=
tasmx /t /dnofstack /d%1 /d%2 /d%3 /d%4 /d%5 /d%6 kernel.asm
tlink /t kernel
kernel.com - 1 fload EXTEND save FORTH-C.EXE bye
tasmx /l /t /d%1 /d%2 /d%3 /d%4 /d%5 /d%6 kernel.asm
tlink /t kernel
kernel.com - 1 fload EXTEND save FORTH-F.EXE bye
forth-f - checking off forget -FP checking on 1 fload EXTEND save FORTH.EXE bye
forth-f - 1 fload SED aka sed EDIT save DX.EXE bye
del kernel.obj
del kernel.map

View File

@ -0,0 +1,5 @@
forth F87D 1 load bye
forth F87DS 1 load bye
forth F87S 1 load bye
forth F87X 1 load bye
copy /y f87d.exe F87.EXE

1
DX-FORTH v430/MISC.SCR Normal file

File diff suppressed because one or more lines are too long

1
DX-FORTH v430/MISER.SCR Normal file

File diff suppressed because one or more lines are too long

1
DX-FORTH v430/MULTI.SCR Normal file

File diff suppressed because one or more lines are too long

306
DX-FORTH v430/MULTI.TXT Normal file
View File

@ -0,0 +1,306 @@
DX-Forth Multitasker
--------------------
1. Introduction
2. Multitasking words
3. Design considerations
4. Semaphores
5. Messages
6. A multitasking example
7. Turnkey applications
8. Task Control Block
1. Introduction
A co-operative multitasker MULTI.SCR is provided with DX-Forth
allowing several tasks to run concurrently within an application.
Each task has its own stacks, user variables and (if required)
PAD and HOLD buffer. Tasks are linked in a 'round-robin' loop
with switching occuring on each encounter of PAUSE.
2. Multitasking words
TCB ( u s r "ccc" -- ) compiling
( -- tcb ) run-time
Create a task control block named ccc. u s r is the number
of bytes reserved for the task's user area, data and return
stacks respectively. The task is initially put to sleep.
When ccc is executed, the address of the task control block
is placed on the data stack.
See: ACTIVATE
ACTIVATE ( tcb -- )
Initialize the stacks and wake task tcb. Task execution
begins with the word following ACTIVATE. ACTIVATE must be
used inside a definition.
HIS ( tcb user -- user' )
Get address of user variable belonging to task tcb.
PAUSE ( -- )
Save the current task state and pass control to the next
active task.
STOP ( -- )
Put the current task to sleep and switch to next active
task.
WAKE ( tcb -- )
Resume the task identified by tcb.
SLEEP ( tcb -- )
Suspend the task identified by tcb.
SINGLE ( -- )
Disable the multitasker. Only the current task remains
active.
MULTI ( -- )
Enable the multitasker.
Note: MULTI does not enable individual tasks. See
ACTIVATE.
GRAB ( sem -- )
Obtain the resource identified by the semaphore variable.
If owned by another task, repeatedly execute PAUSE until
the resource becomes available.
GET ( sem -- )
Same as GRAB but performs an initial PAUSE.
RELEASE ( sem -- )
Release the resource identified by the semaphore variable.
If the resource is owned by another task, do nothing.
/TASKER ( -- )
Initialize the multitasker links. TURNKEYed applications
must execute /TASKER before launching the multitasker.
#FLOAT ( -- u )
A VALUE returning the size in bytes of the separate floating
point stack to be assigned for each task. #FLOAT is preset
to the system default value but may be changed prior to
executing TCB.
3. Design considerations
3.1 Data and return stacks
Sufficient data and return stack space must be allocated for each
task. Inadequate stack can cause mysterious crashes or unexpected
behaviour and can be difficult to trace. It is usually better to
start with larger stack sizes during development and reduce it
once the application is fully debugged.
Note: Task switching consumes 3 cells (6 bytes) of data stack and
must be included when calculating task data stack allocation. If
the task uses floating point on the data stack this must be
included also.
3.2 PAD and HOLD buffer
Tasks are not automatically alloted a PAD or HOLD buffer. If a
PAD or HOLD buffer is required it must be allocated by assigning
extra space to the data stack. When defining a task control block,
use the following calculation:
s (bytes) = task data stack requirement +
HOLD buffer size (default 68 bytes) +
PAD size required
Tasks that display numbers or use the pictured numeric operators
<# ... #> HOLD etc. will require a HOLD buffer. If a task requires
PAD then a HOLD buffer (default 68 bytes) must also be provided.
3.3 USER area
The size of a task user area should be at least #USER bytes. Tasks
may begin defining their per-task user variables at offset #USER.
3.4 Floating-point
If a separate floating-point system is detected, each task is
automatically allocated an f/p stack. The size of the f/p stack
is determined by #FLOAT. If a task performs no floating-point
then #FLOAT may be set to zero.
3.5 PAUSE
Each active task is required to PAUSE to give other tasks a chance
to execute. In DX-Forth PAUSE is automatically performed by KEY?
KEY EMIT TYPE and MS. If a task does not perform any of these
function (or does so infrequently) then a PAUSE must be explicitly
included in the program.
3.6 Other
Tasks are typically defined as an infinite loop e.g. within a BEGIN
AGAIN construct. If a task needs to terminate, use STOP.
Tasks should not assume the initial contents of a user variable e.g.
a task which uses BASE directly or indirectly must explicitly set
BASE to the required number radix.
To build a multitasking application, load MULTI.SCR from your
application. TURNKEY applications must execute /TASKER before
starting the multitasker.
During testing, do not FORGET tasks. Instead use COLD and reload
the application. Do not use SAVE or TURNKEY while the multitasker
is active.
4. Semaphores
Semaphores are used to prevent conflicts that may arise when
several tasks access a common resource. In DX-Forth a semaphore
is simply a VARIABLE with the contents initialized to zero.
Consider the case when two tasks send output to the screen. Since
PAUSE is built into EMIT this would result in a jumbled display.
A solution is to enclose the display routine with SINGLE and MULTI.
While this would work it has the disadvantage that the multitasker
is disabled for all other tasks while printing takes place.
A better way is with semaphores. A semaphore is a variable which
signals whether a resource is available.
In the example below, tasks which display to the screen GET the
resource making it unavailable to other tasks. When the task has
finished with the screen it is RELEASEd. Tasks waiting for a
resource automatically PAUSE until the resource becomes available.
GET GRAB RELEASE are modelled after the Forth Inc. functions of
the same name.
VARIABLE SCREEN \ create a resource for the screen
SCREEN OFF \ mark screen as available
\ TASK1
...
SCREEN GET
10 10 AT-XY ." Task 1"
SCREEN RELEASE
...
\ TASK2
...
SCREEN GET
50 10 AT-XY ." Task 2"
SCREEN RELEASE
...
\ TASK3
...
5. Messages
Messages (also known as mailboxes) provide a way of passing data
between tasks. The following is an example of a simple message
system. While 16 bit data is assumed, the concept can be expanded
to pass data of any type or size - strings, CP/M records etc.
\ Define a message variable
CREATE <name> ( -- addr )
0 , \ flag 0=empty
1 CELLS ALLOT \ storage space
\ Send message
: SEND ( x addr -- )
BEGIN PAUSE DUP @ 0= UNTIL DUP ON CELL+ ! ;
\ Receive message
: RECEIVE ( addr -- x )
BEGIN PAUSE DUP @ UNTIL DUP OFF CELL+ @ ;
6. A Multitasking Example
This simple example that shows how to write a task, launch it, turn
it on and off, disable it and the multitasker altogether.
First load the multitasker system:
USING MULTI.SCR 1 LOAD
Create a task by entering the following definitions:
VARIABLE COUNTS
#USER 32 32 TCB COUNTING
: COUNTER ( -- )
COUNTING ACTIVATE
BEGIN PAUSE 1 COUNTS +! AGAIN ;
: X ( -- ) COUNTS @ U. ;
We have created a task block called COUNTING and reserved #USER
bytes of user area and 32 bytes each for data and return stacks.
Since the task won't be outputting numbers or need a PAD we
haven't allocated any space for them.
The definition COUNTER embodies both the task initialization and
its action. COUNTING ACTIVATE resets the task stacks and wakes it.
Task execution begins with the word immediately following ACTIVATE.
Our example task is very simple - it simply increments the value
held in COUNTS. Since the task is defined as an endless loop,
COUNTS will update automatically whenever the task is in control.
Note there is a PAUSE within the loop - this is important as it
allows other tasks a chance to execute.
Should we want COUNTER to run once or stop looping after some
event, a STOP can be included in the definition.
The following shows how to start and control COUNTER. You may
type X at any time to see whether the task is running.
To control the task we can use:
MULTI ( start the multitasker )
COUNTER ( start our task )
COUNTING SLEEP ( put the task to sleep )
COUNTING WAKE ( wake the task again )
SINGLE ( stop the multitasker )
MULTI ( restart the multitasker again )
7. Turnkey applications
It is important that /TASKER is executed by turnkey applications
before the multitasker is invoked.
8. Task Control Block
R0 ;----------------------
; return stack
FS0 ;----------------------
; fp-stack (if used)
S0 ;----------------------
; data stack
;----------------------
; PAD buffer (if used)
PAD ;----------------------
; HOLD buffer (if used)
HERE ;----------------------
; user variables
tcb ;----------------------

1
DX-FORTH v430/NEWAPP.SCR Normal file

File diff suppressed because one or more lines are too long

160
DX-FORTH v430/NEWAPP.TXT Normal file
View File

@ -0,0 +1,160 @@
NEWAPP and DOSLIB
*** IMPORTANT ***
NEWAPP.SCR and DOSLIB.SCR are subject to change (really!) There is
no guarantee - or intent - that future versions will remain backward
compatible. When backing up or distributing application source code
that uses DOSLIB.SCR, it is important to include a copy as later
versions of DOSLIB may no longer be compatible.
Introduction
NEWAPP is a skeletal program that allows users to quickly develop a
DOS application. It provides often needed tasks including error
handling, command-line parsing, file operations, buffered I/O, help
screen, number and string functions.
NEWAPP comprises two parts:
NEWAPP.SCR skeletal main program
DOSLIB.SCR function library
NEWAPP is supplied as a functioning program which may be turnkeyed.
Styled as a typical DOS command-line application it demonstrates
how the various tasks are integrated to form a functioning program.
Making NEWAPP perform a useful task can be as easy as adding one
line. In this instance it is line 6 of the definition (RUN) which
turns NEWAPP into a simple filecopy utility.
DOSLIB is a library of Forth and DOS functions in source form.
While the primary role is support for NEWAPP, DOSLIB may be used
by any application. DOSLIB is organized as named modules.
1 FLOAD DOSLIB causes the names of all the modules contained in
DOSLIB to be loaded into the dictionary. Executing the name of a
module causes the corresponding code to be loaded into memory.
NEWAPP automatically loads DOSLIB and a default set of modules.
New users are encouraged to examine and understand how NEWAPP works
before attempting to create their own application. The following
notes should help with some of the less obvious aspects. Unless
otherwise stated all screen references refer to NEWAPP.SCR.
First, an explanation of the function +IS which is used by NEWAPP.
+IS is similar to IS but instead of replacing the existing behaviour
of a DEFERed word, it chains in a new action. When the deferred word
is eventually executed, all actions in the chain will be performed
beginning with the most recently added.
1. Setting the options
Screen 1 defines the title of the program, version, date and name
for the turnkey executable.
The programmer may optionally specify the upper limit of memory for
turnkey applications (Screen 1 line 10). This is useful for
environments where memory is limited. The calculation includes 256
bytes for PAD and data stack, plus any RESERVE bytes tallied at
compile-time. Typically RESERVE holds the total number of bytes the
program will ALLOT or otherwise need at run-time. By default LIMIT
is set to the maximum available memory i.e. the compiler's top of
memory address (usually $FFF0 for MS-DOS or CCP/BDOS base for CP/M).
Screen 2 loads the remainder of the application. It also defines
and sets the action for several deferred words which are explained
below.
ONSTART is a deferred word. Its function is to perform any system
initialization that may be required before the application begins.
Typically these will be "run once" tasks such as alloting buffers
or initializing memory management functions. Actions are added to
ONSTART via +IS.
SET-IO is a deferred word that sets the console input/output method.
By default SET-IO is set to BIOS-IO. Users needing DOS console I/O
redirection can do so either by selectively surrounding words with
DOS-IO ... SET-IO pairs or by uncommenting the line:
' DOS-IO IS SET-IO.
The DOSLIB disk read/write routines include a keyboard test. If
ESC CTRL-C or CTRL-BREAK keys are detected, the user is given an
opportunity to abort the program. The feature may be disabled by
commenting out the line: ' (?BREAK) IS ?BREAK.
ONERROR is the application's top-level error handler. It intercepts
exceptions before the system's error handler deals with it. ONERROR
permits the application to perform any necessary 'clean-up' tasks
before aborting.
ONERROR is a deferred word whose action is modified with +IS. An
example is the DOSLIB 'files' module which extends ONERROR to
automatically close the default files should an error occur.
Note: If a function performed by ONERROR itself generates an exception
then the original exception that caused ONERROR to execute is likely
to be masked.
2. Loading DOSLIB modules
Screen 3 of NEWAPP.SCR initializes the DOSLIB library then proceeds
to load the named modules. This screen contains the support modules
typically needed by NEWAPP based applications. If your application
does not require a particular module and you wish to conserve space,
then you may comment out the line on which the module's name appears.
3. Default files
The default files module simplifies much of the drudgery associated
with file handling e.g. display of filenames when opening, overwrite
checking, error messages when reading or writing files etc.
One input and one output file are supported which is sufficient for
most applications. The usual file read/write functions are provided
including file position and reposition. Output file overwrite
checking is enabled by default. It may be turned off by uncommenting
the line: WRTCHK OFF on screen 2.
When an application aborts as a result of a fatal error, the default
files will be automatically flushed and closed. If it is desired to
delete the default output file, it can be done by uncommenting the
line on screen 2: ' DELOUTFILE +IS ONERROR
FLUSHWRITE is an optional function that works similarly to FLUSH-FILE.
Data written to the default output file is forced to disk updating
the directory. Buffered output, if loaded, is also flushed.
4. Buffered files
This is an optional extension to the default files and allows reading
and writing one character at a time. For speed buffers are used to
hold the data. Buffer refill and flushing is automatic and requires
no user intervention. The default buffer size is 512 bytes and is
given by /INBUF /OUTBUF respectively. Normally the buffers are
allocated at compile-time but this can be changed to run-time if
desired.
Example: Allocate the buffered output file at run-time and change
the buffer size to 1024 bytes.
Make the following changes to the copy of NEWAPP.SCR that will be
your application.
Step 1. Disable compile-time buffer allocation by setting /OUTFILE
to zero prior to executing _Bufoutfile.
( Screen 3 Line 13)
0 to /OUTFILE _Bufoutfile \ buffered output file
Step 2. Initialize output buffer at run-time by creating a word to
perform the task and appending it to deferred word ONSTART.
( Screen 2 Line 13)
:noname ( -- ) #1024 to /OUTFILE here to OUTFILE
/OUTFILE allot resetoutbuf ; +is ONSTART
Note: Applications may apply this technique to any large buffer used
by the program. It is useful for keeping turnkey executables small
and/or allocating buffers greater than would fit in memory at compile-
time.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,19 @@
A note for users upgrading from previous versions of DX-Forth
-------------------------------------------------------------
Changes and improvements to DX-Forth may occasionally result in
compatibility issues with previous application software.
Usually the problem takes the form of an application either not
loading successfully or (less common) not running - despite its
compiling and running correctly on a previous version of DX-Forth.
For the first case, the user should try loading OBSOLETE.SCR before
loading the application. In most cases this will fix the problem.
OBSOLETE.SCR contains functions that once existed in DX-Forth but
were removed due to obsolescence.
Should the application compile but fail to execute correctly then
the incompatibility is likely to be more subtle. In this instance
one should read CHANGES.TXT to ascertain what function behaviours
have changed since the application was originally developed.

File diff suppressed because one or more lines are too long

1
DX-FORTH v430/SED.SCR Normal file

File diff suppressed because one or more lines are too long

152
DX-FORTH v430/SED.TXT Normal file
View File

@ -0,0 +1,152 @@
Full-Screen Editor for DX-FORTH
-------------------------------
*** IMPORTANT ***
After editing a screen, Ctrl-K must be pressed to UPDATE
the changes. This is a safeguard as there is no backup
copy of the source file being editing. Until Ctrl-K is
pressed, the screen may be restored to its previous state
using Ctrl-L.
INSTALLATION:
DX-FORTH for CP/M must be configured for your terminal before
using the full screen editor. See DX-FORTH.TXT for further
details.
INVOKING:
The screen editor is invoked typing SED. If the editor is not
resident it is automatically loaded from the disk file SED.SCR.
If you mainly use screen files you may want to add EDIT as a
synonym for SED e.g. AKA SED EDIT
DX (COM or EXE) comes pre-loaded with the screen editor.
COMMANDS:
SED ( n | -- )
Enter the full screen editor, selecting screen n for
editing. If no screen number is specified, then the screen
last LISTed is used or, in the case a LOAD error, the screen
and position where the error occured.
Note: If the screen number is out of range, then the highest
screen available is used. If the size of the screen file
was zero when EDIT was called, it will be extended by one
block.
L ( -- ) List
Lists the current screen. The screen number is obtained
from the variable SCR which is set by LIST, EDIT or when a
LOAD error occurs.
N ( -- ) Next
Increment the screen number in variable SCR then list it.
B ( -- ) Back
Decrement the screen number in variable SCR then list it.
LS ( -- ) List Swap
Perform SWAP-FILE and list the screen specified by SCR.
EDITOR COMMANDS:
1. Cursor movement
Ctrl-E Move cursor up
Ctrl-X Move cursor down
Ctrl-D Move cursor right
Ctrl-S Move cursor left
Ctrl-I Move cursor 4 places to the right (TAB)
Ctrl-Q Move cursor to the upper left of the screen
2. Editing
Ctrl-G Delete character to the right of the cursor
Ctrl-H Delete character to the left of the cursor
Ctrl-T Erase all characters to the right of the cursor
Ctrl-O Insert space at the current cursor position
Ctrl-Y Delete the current line. Lines below cursor are moved
up one position. Pop a line from circular buffer into
the bottom line
Ctrl-N Insert blank line. Lines below cursor are moved down
one position. Push bottom line to the circular buffer
Ctrl-W Split the current line at the cursor position
Ctrl-F Join the next line at the cursor position
Ctrl-A Copy the contents of the current line to the one-line
buffer
Ctrl-P Copy the contents of the one-line buffer to the
current line
Ctrl-K Update all changes made to the screen
3. Miscellaneous
Ctrl-C Move to the next screen
Ctrl-R Move to the previous screen
Ctrl-J Jump to another screen
Ctrl-B Redraw the screen. Used if the screen has become
garbled e.g. after displaying blocks containing binary
data
Ctrl-L Reload the current file block
Ctrl-V Toggle between insert or overwrite mode
Ctrl-U Exit the editor
Ctrl-Z Multi-function command
S - clear the screen contents
B - clear the circular buffer contents
I - insert a blank screen at the current position
D - delete the current screen copying it to the buffer
ESC Toggle between normal and graphics mode
4. Utilities
The following commands are available from the EDITOR vocabulary
IMPORT ( n1 n2 -- )
Copy screens n1 thru n2 from the secondary file inserting
them beginning at screen SCR of the current file.
EXPORT ( n1 n2 -- )
Copy screens n1 thru n2 from the current file inserting
them beginning at screen SCR of the secondary file.
IMPORT and EXPORT assume two screen files are currently open
and SCR of the target file has been set (SCR may be viewed with
FYI). After the operation, target SCR is set to the last block
written plus 1.
5. Notes
In the DOS version of the editor, the arrows keys, PgUp, PgDn,
Home, Insert and Delete keys may be used in addition to the
usual control-key sequences.
COPY COPIES EXPAND (found in earlier versions of the editor)
are redundant as the ability to insert or delete screens is now
available from Ctrl-Z.
To extend a screenfile, enter EDIT then jump to the desired
screen number using Ctrl-J. Alternatively, truncating/
extending a screenfile may also be done from the Forth
environment using FILEBLOCKS.
A special graphics mode has been added. It is toggled via the
ESC key and allows graphic characters to be entered from the
keyboard. It is intended to allow the insertion of PC symbols
or graphic characters into quoted strings. Refer to
DX-FORTH.TXT for a table of keys and their corresponding codes.
To exit graphics mode, press ESC again.

1
DX-FORTH v430/SHOW.SCR Normal file

File diff suppressed because one or more lines are too long

17
DX-FORTH v430/SIEVE.F Normal file
View File

@ -0,0 +1,17 @@
8190 CONSTANT SIZE
VARIABLE FLAGS SIZE ALLOT
: SIEVE
." primes 10 iterations: "
10 0 DO
FLAGS SIZE -1 FILL
0 SIZE 0 DO
I FLAGS + C@ IF
I 2 * 3 + DUP I + BEGIN
DUP SIZE < WHILE
DUP FLAGS + 0 SWAP C! OVER +
REPEAT DROP DROP 1+
THEN LOOP
LOOP
. ;

1
DX-FORTH v430/SSED.SCR Normal file
View File

@ -0,0 +1 @@
\ SED Turns DX-Forth screen editor into a stand-alone utility \ Load screen empty forth definitions decimal system checking off forget -TASK [defined] -FP [if] forget -FP [then] checking on 1 fload SED : PROGRAM ( -- ) cmdtail 'source 2! using cr ." Forth Screen Editor" cr ." type CTRL-U to exit " key drop 0 sed close ; turnkey-system program SED bye

1
DX-FORTH v430/STKCHK.SCR Normal file
View File

@ -0,0 +1 @@
\ Stack Balance Checking Utility Helps locate words which should be stack-neutral but aren't! Use: place [S S] around the words you wish to test for balance e.g. BEGIN [S ... S] AGAIN Use as many [S S] pairs as needed. Should the stack level change at run-time, the application will stop and display the screen number where the offending definition was compiled. Nesting to 16 levels is allowed. CREATE csd 0 C, 16 CELLS ALLOT \ stack depth array : [S ( -- ) DEPTH csd COUNT 1+ 15 AND DUP csd C! CELLS + ! ; : [s] ( blk -- ) DUP SCR ! >R DEPTH csd COUNT DUP 1- csd C! CELLS + @ - IF PAGE ." Stack changed: Scr# = " R@ . CR QUIT THEN R> DROP ; : S] ( -- ) BLK @ POSTPONE LITERAL POSTPONE [s] ; IMMEDIATE

File diff suppressed because one or more lines are too long

451
DX-FORTH v430/TED.F Normal file
View File

@ -0,0 +1,451 @@
\ TED.F
\
\ TED - A Tiny Text Editor for DX-Forth
\
\ Based on the HT-68K editor by J.Bartel
\
\ The HELP screen is only compiled for the
\ turnkey version
\
\ ^E Up cursor ^R Prev page
\ ^X Down cursor ^C Next page
\ ^D Right cursor ^G Del next char
\ ^S Left cursor ^H Del prev char
\ ^L Restore line ^M New line
\ ^T Erase to EOL ^Y Delete line
\ ^U Exit editor ^Z Function
\ ^ZC Clear text ^ZH Help
\ ^ZR Read file ^ZW Write file
\
\ Revision
\ 2016-09-25 es updated for DX-Forth
\ 2015-06-03 es specify a filename
\ 2015-12-09 es join lines with ^G or DEL
\ 2017-01-25 es replace EXIT THEN with END
forth definitions decimal
0 \ true for turnkey
( *) dup [if] application [then]
cr .( loading TED Text Editor )
\ Running DX-Forth for CP/M or DOS ?
: CPM? ( -- f ) $111 @ $4683 = ;
[undefined] ZCOUNT [if]
: ZCOUNT ( a -- a u ) dup -1 0 scan drop over - ;
[then]
[undefined] ZPLACE [if]
: ZPLACE ( a -- a u ) 2dup + >r swap cmove 0 r> c! ;
[then]
[undefined] PACK [if]
: PACK ( a u a2 -- a2 ) dup >r place r> ;
[then]
[undefined] TOKEN [if]
: TOKEN ( "name" -- c-addr u ) bl word count ;
[then]
\ Video terminal specific
79 value XMAX \ #columns - 1
24 value YMAX \ #rows - 1
\ INSERT-LINE ( -- ) insert blank line at cursor;
\ remaining rows scroll down
\ DELETE-LINE ( -- ) delete line at cursor;
\ remaining rows scroll up
\ CLEAR-LINE ( -- ) blank from cursor to end of line
\ pointer operations
: 1+! ( a -- ) 1 swap +! ;
: 1-! ( a -- ) -1 swap +! ;
: C@+ ( a -- c ) dup @ c@ swap 1+! ;
: C!+ ( c a -- ) tuck @ c! 1+! ;
: -C@ ( a -- c ) dup 1-! @ c@ ;
: -C! ( c a -- ) dup 1-! @ c! ;
\ max line length
132 constant COLS
0 value YBOT \ edit bottom row
0 value BUF \ edit buffer addr
0 value BUFE \ edit buffer end + 1
0 value TBUF \ text buffer addr
0 value LINES \ line count
0 value MEM \ top of memory
0 value FNAM \ filename buffer addr
0 value FID \ file handle
variable COL \ current column#
variable LIN \ current line#
variable LADR \ current line addr
variable LTOP \ absolute line# at top of screen
variable LPOS \ current line# relative to top of screen
variable BPOS \ address of char in edit buffer
variable NXT \ next free addr in text (contains 0)
variable UPD \ edit buffer change flag
variable XF \ quit flag
: UKEY ( -- c ) key upcase ;
: LMAX ( -- n ) lines 1- 0 max ;
: GOXY ( x y -- ) 1+ at-xy ;
: CXY ( -- ) col @ XMAX min lpos @ goxy ;
: MSG ( -- ) 0 0 at-xy clear-line ;
: CHGD ( -- ) upd on ;
: CONT ( -- ) xf off
." Press a key to continue " key drop ;
: .FIL ( -- ) fnam count 20 min type ;
: .POS ( -- )
13 0 at-xy lin @ 1+ u.
22 0 at-xy col @ 1+ u. cxy ;
: .HD ( -- ) msg 10 0 at-xy
[ dup ] [if]
." Ln Cl ^ZH Help File "
[else]
." Ln Cl File "
[then]
.fil .pos ;
: .ERR ( a u -- ) msg .fil space space type cont .hd ;
: SURE? ( a u -- f )
msg type ." Are you sure? " ukey [char] Y = ;
: LINE ( -- a u ) ladr @ zcount ;
: .LINE ( -- ) line XMAX 1+ min type ;
: .RT ( -- ) \ display string right of cursor
bpos @ bufe over - XMAX 1+ bpos @ buf - - min type ;
: ROOM? ( -- f ) bufe 1- c@ bl = ;
: LINE@ ( -- lin adr ) lin @ ladr @ ;
: LINE! ( lin adr -- ) ladr ! lin ! ;
: GOTOP ( -- ) tbuf ladr ! lin off ;
: CURTOP ( -- )
gotop ltop off col off lpos off ;
\ clear text, filename, reset cursor
: -TXT ( -- ) tbuf dup 1- 3 erase ( nulls )
1+ nxt ! 1 to lines 0 fnam c! curtop ;
: SETUP ( -- )
[ cpm? ] [if]
$168 c@ 1- to XMAX
$169 c@ 1- dup to YMAX 2- to YBOT
[else]
get-window ( x1 y1 x2 y2 )
rot - dup to YMAX 2- to YBOT
swap - to XMAX
[then]
application here unused + to mem pad 80 +
dup to fnam 80 + dup to buf COLS + dup to bufe
2+ dup to tbuf mem u> abort" no space" -txt ;
: INSC ( c -- ) \ insert char in buf
bpos @ dup 1+ bufe over - 1+ cmove>
bpos c!+ ;
: LU ( -- ) \ go up one line in text
lin 1-!
ladr dup 1-! begin dup -c@ 0= until 1+! ;
: LD ( -- ) \ go down one line in text
lin 1+! ladr begin dup c@+ 0= until drop ;
: SETLIN ( n -- ) \ setup for line n
tbuf over 0 ?do zcount + 1+ loop
ladr ! lin ! ;
: LINES+ ( -- ) lines 1+ to lines ;
: LINES- ( -- ) lines 1- to lines ;
: ?MEM ( -- )
nxt @ mem u< not if s" no space" .err then ;
: REPL ( a u -- ) \ replace line in text
>r line r@ over - >r
over + dup r@ + nxt @ 1+ dup >r
2 pick - move 2r> + dup off nxt !
r> cmove ?mem ;
: BSTR ( -- a u ) \ string in buffer
buf bufe over - -trailing ;
: LEAV ( -- ) \ leave the line we are on
upd @ if bstr repl then upd off ;
: ENTER ( -- ) \ start changes on this line
line buf dup COLS blank swap cmove
buf col @ + bpos ! upd off ;
: .ALL ( -- ) \ update screen
leav enter
page line@
ltop @ dup setlin
lmax swap - YBOT min
1+ 0 ?do 0 i goxy .line ld loop
line! .hd cxy ;
: SLN ( ltop lin -- )
>r 0 max lmax min dup r> max lmax min
dup setlin over - lpos ! ltop ! .all ;
: PU ( -- ) \ ^R page up
lin @ if
leav ltop @ YBOT - lin @ YBOT - sln
then ;
: PD ( -- ) \ ^C page dn
lin @ lines < if
leav ltop @ YBOT + lin @ YBOT + sln
then ;
: SU ( -- ) \ scroll up, new line at bottom
0 0 goxy delete-line 0 YBOT dup lpos ! goxy ;
: SD ( -- ) \ scroll down, new line at top
0 0 goxy insert-line lpos off ;
-? : UP ( -- ) \ ^E line up
lin @ if
leav lu
lin @ ltop @ 1- = if
sd .line ltop 1-!
else
lpos 1-!
then
enter .pos
then ;
: DN ( -- ) \ ^X line dn
lin @ lines < if
leav ld
lin @ ltop @ YBOT 1+ + = if
su .line ltop 1+!
else
lpos 1+!
then
enter .pos
then ;
: RT ( -- ) \ ^D right
col @ XMAX < if
col 1+! bpos 1+! .pos
then ;
: LFT ( -- ) \ ^S left
col @ if
bpos 1-! col 1-! .pos
then ;
: TAB ( -- ) \ ^I tab
4 col @ over mod - 0 do rt loop ;
: NLN ( -- ) \ ^M new line
room? if
13 insc chgd leav
ladr begin dup c@+ 13 = until 0 over -c! 1+!
lines+ lin 1+!
clear-line col off enter
lpos @ YBOT = if
su ltop 1+!
else
lpos 1+! insert-line cxy
then
.all
then ;
: DEL ( -- ) \ ^G del next
bpos @ bstr + < if ( del char)
bpos @ dup 1+ swap bufe bl over c! over - 1+ cmove
.rt cxy chgd
else ( join line)
chgd leav line COLS over - >r
+ dup 1+ zcount r> min rot zplace .all
then ;
: BS ( -- ) \ ^H del prev
col @ if lft del then ;
: DLN ( -- ) \ ^Y del line
lin @ lines < if
ladr @
ld enter 13 ladr -c!
ladr !
chgd leav enter
lines- lin 1-!
delete-line
ltop @ YBOT + lines < if
line@
ltop @ YBOT + setlin 0 YBOT goxy .line
line!
then
.pos
then ;
: RST ( -- ) \ ^L restore line
0 lpos @ goxy clear-line .line cxy
enter ;
: DEOL ( -- ) \ ^T delete to EOL
bufe bpos @ - blank
clear-line cxy chgd ;
: CHAROK ( c -- )
dup bl 126 between room? and if
dup insc dup emit col 1+! .rt
.pos chgd
then drop ;
: CLR ( -- ) \ ^ZC
s" *** Clear text: " sure? if leav -txt then
.all ;
: GETN ( -- a u ) msg ." Filename: "
pad dup XMAX 10 - accept ;
: STNAM ( a u -- a u )
2dup fnam pack count upper 0 to fid ;
: CLOSF ( -- ) fid ?dup if close-file drop then ;
: CLN ( a u -- ) \ ctl chars to spaces
over + swap ?do i c@ bl max i c! loop ;
: (RD) ( a u -- )
stnam r/w open-file throw to fid
0 to lines tbuf dup off dup 1+ nxt !
( a) begin
dup COLS 2dup + mem u> throw
fid read-line throw ( a u' f )
while
2dup cln + 0 over c! ( null)
1+ dup nxt ! lines+
repeat 2drop nxt @ off ;
: RD ( a u -- )
s" F" +ext ( append .F extension if none )
leav ['] (rd) catch if
2drop s" load/size error" .err -txt
then closf curtop .all ;
: (WR) ( a u -- )
stnam r/w create-file throw to fid
tbuf begin ( a)
dup nxt @ u<
while
zcount 2dup fid write-line drop + 1+
repeat drop ;
: WR ( a u -- )
leav ['] (wr) catch if
2drop s" save error" .err
then closf .all ;
: ZRD ( -- ) \ ^ZR read file into text buffer
getn rd .hd ;
: ZWR ( -- ) \ ^ZW write text to file
getn wr .hd ;
: SAV ( -- )
fnam count dup 0= if 2drop getn then wr ;
dup [if]
: HLP ( -- ) \ ^ZH help
leav page 14 spaces ." Help Menu"
cr ." ^E Up cursor ^R Prev page"
cr ." ^X Down cursor ^C Next page"
cr ." ^D Right cursor ^G Del next char"
cr ." ^S Left cursor ^H Del prev char"
cr ." ^L Restore line ^M New line"
cr ." ^T Erase to EOL ^Y Delete line"
cr ." ^U Exit editor ^Z Function"
cr ." ^ZC Clear text ^ZH Help"
cr ." ^ZR Read file ^ZW Write file"
cr cr cont .all ;
[then]
: FN ( -- ) \ ^Z function
[ dup ] [if]
msg ." *** (R)ead, (W)rite, (C)lear, (H)elp ? " ukey
[char] H of hlp end \ ^ZH help
[else]
msg ." *** (R)ead, (W)rite, (C)lear ? " ukey
[then]
[char] C of clr end \ ^ZC clear
[char] R of zrd end \ ^ZR read
[char] W of zwr end \ ^ZW write
drop .hd ;
: DONE ( -- ) \ ^U Quit editor
msg ." *** Exit: (S)ave, (Q)uit ? " ukey
[char] Q of xf on end
[char] S of sav xf on end
drop .hd ;
: KMAP ( c1 -- c2 ) \ map in arrow keys etc
[ cpm? ] [if]
$14F c@ of 5 end $150 c@ of 24 end
$151 c@ of 4 end $152 c@ of 19 end
127 of 7 end
[else]
200 of 5 end 208 of 24 end
205 of 4 end 203 of 19 end
211 of 7 end
210 of 22 end 201 of 18 end
209 of 3 end 199 of 17 end
[then] ;
: CMD ( -- ) key kmap
3 of pd ( ^C) end 4 of rt ( ^D) end
5 of up ( ^E) end 7 of del ( ^G) end
8 of bs ( ^H) end 9 of tab ( ^I) end
12 of rst ( ^L) end 13 of nln ( ^M) end
18 of pu ( ^R) end 19 of lft ( ^S) end
20 of deol ( ^T) end 21 of done ( ^U) end
24 of dn ( ^X) end 25 of dln ( ^Y) end
26 of fn ( ^Z) end
charok ;
\ Load & edit textfile addr len. If len=0 don't load.
: (TED) ( line addr len -- )
setup page .hd
?dup if
rd ( line ) 1- dup 7 - swap sln
else 2drop then
enter xf off begin cmd xf @ until
0 YMAX at-xy cr cr ;
( *) [if]
\ Turnkey version
-? : TED ( -- ) 1 cmdtail (ted) ; turnkey ted ted bye
[else]
\ Resident version
-? : TED ( "filename[.F]" -- ) token dup if 1 -rot
else 2drop loadline @ lastfile then (ted) ;
\ aka TED EDIT
behead cpm? cmd
[then]
forth definitions application

79
DX-FORTH v430/TED.TXT Normal file
View File

@ -0,0 +1,79 @@
Text File Editor for DX-FORTH
-----------------------------
TED is a resident text file editor.
INSTALLATION:
DX-FORTH for CP/M must be configured for your terminal before
using the text file editor. See DX-FORTH.TXT for further
details.
Users who prefer working with text files can replace the
resident screen file editor in DX-Forth with TED. To do this
enter the following from the DOS command prompt:
A:FORTH-F - SYSTEM INCLUDE TED AKA TED EDIT SAVE DX BYE
INVOKING:
The text editor is invoked by typing TED. If the editor is
not resident it is automatically loaded from disk file TED.F
If you mainly use text files you may want to add EDIT as a
synonym for TED as previously described.
TED ( "filename[.F]" -- )
Load and edit the text file "filename". If no filename is
given use the file specified by LASTFILE and LOADLINE.
Note: Specifying a filename with TED is only available once
TED has been loaded and the loader stub overwritten.
A "load/size error" is reported if the file cannot be found,
is write-protected or too large to fit in memory.
Edits are confined to memory and only written to disk on
exit with ^U (S)ave or when writing to another filename with
^Z (W)rite.
Lines can be up to 132 characters but only the leftmost are
displayed and directly editable. Tabs are converted to
single spaces.
COMMANDS:
1. Cursor movement
Ctrl-E Move cursor up
Ctrl-X Move cursor down
Ctrl-D Move cursor right
Ctrl-S Move cursor left
Ctrl-I Move cursor to the next tab stop (TAB)
2. Editing
Ctrl-G Delete character to the right of the cursor
Ctrl-H Delete character to the left of the cursor
Ctrl-T Erase all characters to the right of the cursor
Ctrl-Y Delete the current line. Lines below cursor are moved
up one position.
Ctrl-M Insert a blank line at the cursor position
3. Miscellaneous
Ctrl-C Move to the next page
Ctrl-R Move to the previous page
Ctrl-L Restore the current line
Ctrl-U Exit the editor
Ctrl-Z Multi-function command
C - clear the text buffer
H - show help screen (if present)
R - read file from disk
W - write file to disk

1
DX-FORTH v430/TOOLS.SCR Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,94 @@
WHATSNEW.TXT - DX-FORTH for DOS
Note: only significant changes/fixes are listed.
! changed + added * fixed - removed
v4.30 2017-02-11
+ I' END BOUNDS
! EXIT made non-immediate
! MISC: Add MJD. Rename D/MOD to SD/REM
- (EXIT)
v4.20 2016-10-07
+ EOL
! QUIT moved to Application
! Rename PARSE$ FREEZE PACKED to /PARSE PROTECT PACK
v4.10 2016-07-13
+ (.) (U.)
v4.09 2016-05-20
! Rename WORDS-LIKE to WORDS:
v4.08 2016-01-16
* File not found error in INCLUDE displays wrong filename
v4.07 2016-01-07
+ TRIM
* WARNING incorrectly disabled by consecutive -?
v4.06 2015-07-26
+ LAST BAL
! CSP extended to 2 cells
- +BAL -BAL
* Turnkey initialization improperly wrote to high memory
v4.05 2015-05-16
+ BINARY -BLANKS LASTFILE
+ Interpret numbers with % prefix as binary
+ TED text file editor
! APPLICATION moved to Application dictionary
- CTOGGLE (see MISC.SCR for alternative)
v4.04 2015-04-12
+ #USER .FREE LS BOLD BRIGHT INVERSE
! ABORT" made state-smart
! Rename FILE? to SCREEN?
! Revised multitasker locals
* Fix ASMTEST to use -ALLOT
v4.03 2015-01-07
+ -ALLOT
! ALLOT may no longer use negative values. See glossary.
! /MS is now DEFERed
v4.02 2014-09-29
+ WAIT-TICK
! . and ? display unsigned when BASE not decimal
* LOCALS.SCR updated to compile with DX4
v4.01 2014-07-22
* ASM: Fix bug in XCHG which caused subsequent instructions to be
assembled in BYTE mode
v4.00 2014-07-19
+ 2NIP @EXECUTE W>NAME CMDTAIL PARSE$ >FNAME TOKEN WORDS-LIKE CHAIN
+ CTOGGLE PACKED S.R SHOLD NHOLD LREAD LWRITE LINK, S, ?BLOCK
+ FPICK S>F F>S
+ READ-LINE recognizes CP/M EOF terminator ($1A)
! ADDR made state-smart
! OPEN now requires a file-access-method
! Rename >NEXT, FORWARD, BACK to 'NEXT, >MARK, <RESOLVE
! WORDS "pattern" now handled by WORDS-LIKE
! Improve compiler security
! MARKER is no longer ANS compatible
! Allow leading decimal point on float input
* INCLUDED didn't restore block contents
* TXT2BLK fixed to work with CP/M
- PARSE" ASCIIZ M/MOD
- ONLY ALSO PREVIOUS WORDLIST SEARCH-WORDLIST FORTH-WORDLIST ENVIRONMENT?

3
DX-FORTH v430/m.bat Normal file
View File

@ -0,0 +1,3 @@
ntvdm -c -p forth - include %1.f %1 bye