: NAME ... ;
CREATE name |
VARIABLE name |
n CONSTANT name |
FVARIABLE name |
f FCONSTANT name |
CREATE
is not currently supported inside word definitions; hence,
the ability to create your own defining words is not available in kForth
at the present time.FORGET
may be used to remove words from the
dictionary. TypingFORGET
name
Allowed data stack operations are listed in the following table:
DUP | n -- n n | duplicate |
?DUP | n -- n n | 0 | dup if not zero |
SWAP | n1 n2 -- n2 n1 | swap |
OVER | n1 n2 -- n1 n2 n1 | over |
ROT | n1 n2 n3 -- n2 n3 n1 | rotate cw |
-ROT | n1 n2 n3 -- n3 n1 n2 | rotate ccw |
DROP | n1 -- | drop |
NIP | n1 n2 -- n2 | nip |
TUCK | n1 n2 -- n2 n1 n2 | tuck |
PICK | ... n -- ... m | copy nth item deep |
ROLL | ... n -- ... m | rotate nth item deep to top of stack |
DEPTH | ... -- ... n | stack depth |
2DUP | n1 n2 -- n1 n2 n1 n2 | |
2SWAP |
n1 n2 n3 n4 -- n3 n4 n1 n2 | |
2OVER |
n1 n2 n3 n4 -- n1 n2 n3 n4 n1 n2 | |
2ROT |
n1 n2 n3 n4 n5 n6 -- n3 n4 n5 n6 n1n2 | |
2DROP |
n1 n2 -- | |
FDUP | f -- f f | same as 2DUP |
FSWAP |
f1 f2 -- f2 f1 | same as 2SWAP |
FOVER |
f1 f2 -- f1 f2 f1 | same as 2OVER |
FROT |
f1 f2 f3 -- f2 f3 f1 | same as 2ROT |
FDROP |
f1 -- | same as 2DROP |
Return stack operations are:
>R |
n -- | push onto return stack |
R> |
-- n | pop from return stack |
R@ |
-- n | copy from top of return stack |
I | -- n | current loop index |
J | -- n | next outer loop index |
UNLOOP | -- | discard loop parameters from return stack |
The following memory access words are implemented:
@ | a -- n | fetch single |
! | n a -- | store single n to address a |
A@ | a1 -- a2 | fetch address from address a |
C@ | a -- n | fetch byte |
C! |
n a -- | store byte |
W@ | a -- n | fetch signed word |
W! | n a -- | store signed word |
SF@ | a -- f | fetch single precision float |
SF! | f a -- | store f as single precision float |
DF@ | a -- f | fetch double precision float |
DF! | f a -- | store double precision float |
F@ | a -- f | same as DF@ |
F! | f a -- | same as DF! |
SP@ | -- a | fetch data stack pointer |
RP@ | -- a | fetch return stack pointer |
ALLOT | n -- | allocates n bytes in the dictionary |
" | -- ^str | compile a counted string into the string table; |
the string is taken from the input stream and | ||
must be terminated by " | ||
COUNT | ^str -- a n | convert counted string address to character |
buffer address a and character count n | ||
CMOVE | a1 a2 n -- | move n bytes from source a1 to dest a2 |
CMOVE> | a1 a2 n -- | move n bytes from a1 to a2 in descending order |
FILL | a n1 n2 -- | fill n1 bytes with byte value n2 starting at a |
The non-ANSI standard word A@
is needed because
kForth performs type checking for operands involved in
memory access. It is essentially identical to @
except the type field is set to be an address for the
retrieved value.
Addresses can be stored in ordinary variables using !
;
however they should be retrieved with A@
.
AND | n1 n2 -- n3 | bitwise AND of n1 and n2 |
OR | n1 n2 -- n3 | bitwise OR of n1 and n2 |
XOR | n2 n2 -- n3 | bitwise exclusive OR of n1 and n2 |
NOT | n1 -- n2 | one's complement of n1 |
INVERT | n1 -- n2 | same as NOT |
LSHIFT | n1 n2 -- n3 | n3 is n1 shifted left by n2 bits |
RSHIFT | n1 n2 -- n3 | n3 is n1 shifted right by n2 bits |
The following control structures are provided in kForth:
DO ... LOOP |
DO ... +LOOP |
IF ... THEN |
IF ... ELSE ... THEN |
BEGIN ... AGAIN |
BEGIN ... UNTIL |
BEGIN ... WHILE ... REPEAT |
All control stuctures may be nested --- for DO
loops
the number of levels of nesting is only limited by return stack space.
The following execution control words are also defined:
LEAVE |
EXIT |
QUIT |
ABORT |
LEAVE
removes the current loop parameters
from the return stack, by calling UNLOOP
, and causes
an immediate jump out of the current loop. Execution
resumes at the instruction following the loop.EXIT
causes an immediate return from the word
currently being executed. Note that EXIT
from
within a loop requires that the loop parameters be discarded
from the return stack explicitly with UNLOOP
.QUIT
empties the return stack, terminates execution
of the current word and returns kForth to the interpreter mode.ABORT
empties the data stack and executes QUIT
.
Single Integer Operations
+ | n1 n2 -- n3 | add |
- | n1 n2 -- n3 | subtract (n3 = n1 - n2) |
* | n1 n2 -- n3 | multiply |
/ | n1 n2 -- n3 | divide ( n3 = n1/n2) |
+! | n a -- | add n to value at address a |
1+ | n1 -- n2 | increment (n2 = n1 + 1) |
1- | n1 -- n2 | decrement (n2 = n1 - 1) |
2+ | n1 -- n2 | n2 = n1 + 2 |
2- | n1 -- n2 | n2 = n1 - 2 |
2* | n1 -- n2 | arithmetic left shift (n2 = n1*2) |
2/ | n1 -- n2 | arithmetic right shift (n2 = n1/2) |
MOD | n1 n2 -- n3 | modulus |
/MOD | n1 n2 -- n3 n4 | n3 = remainder and n4 = quotient for n1/n2 |
*/ | n1 n2 n3 -- n4 | n4 = n1*n2/n3; intermediate value is 64 bit |
*/MOD | n1 n2 n3 -- n4 n5 | n4 and n5 are remainder and quotient for n1*n2/n3 |
ABS | n1 -- n2 | absolute value |
NEGATE | n1 -- n2 | n2 = -n1 |
MIN | n1 n2 -- n1 | n2 | minimum of n1 and n2 |
MAX | n1 n2 -- n1 | n2 | maximum of n1 and n2 |
= | n1 n2 -- b | test n1 equal to n2 |
<> | n1 n2 -- b | test n1 not equal to n2 |
< | n1 n2 -- b | test n1 less than n2 |
> | n1 n2 -- b | test n1 greater than n2 |
<= | n1 n2 -- b | test n1 less than or equal to n2 |
>= | n1 n2 -- b | test n1 greater than or equal to n2 |
U < | u1 u2 -- b | test unsigned u1 less than u2 |
0< | n -- b | test n less than zero |
0> | n -- b | test n greater than zero |
0= | n -- b | test n equal to zero |
TRUE
(-1) and
FALSE
(0).
Floating Point Operations
F+ | f1 f2 -- f3 | fadd |
F- | f1 f2 -- f3 | fsubtract (f3 = f1 - f2) |
F* | f1 f2 -- f3 | fmultiply |
F/ | f1 f2 -- f3 | fdivide ( f3 = f1/f2) |
FABS | f1 -- f2 | absolute value |
FNEGATE | f1 -- f2 | f2 = -f1 |
FROUND | f1 -- f2 | round to nearest whole number |
FLOOR | f1 -- f2 | round down to whole number |
FMIN | f1 f2 -- f1 | f2 | minimum of f1 and f2 |
FMAX | f1 f2 -- f1 | f2 | maximum of f1 and f2 |
F= | f1 f2 -- b | test f1 equal to f2 |
F<> | f1 f2 -- b | test f1 not equal to f2 |
F< | f1 f2 -- b | test f1 less than f2 |
F> | f1 f2 -- b | test f1 greater than f2 |
F<= | f1 f2 -- b | test f1 less than or equal to f2 |
F>= | f1 f2 -- b | test f1 greater than or equal to f2 |
F** | f1 f2 -- f3 | f3 = f1 raised to power of f2 |
FSQRT | f1 -- f2 | square root |
FLOG | f1 -- f2 | f2 = log base 10 of f1 |
FEXP | f1 -- f2 | f2 = exp(f1) |
FLN | f1 -- f2 | f2 = log base e of f1 |
DEG>RAD | f1 -- f2 | degrees to radians |
RAD>DEG | f1 -- f2 | radians to degrees |
FSIN | f1 -- f2 | f2 = sin(f1) |
FCOS | f1 -- f2 | f2 = cos(f1) |
FTAN | f1 -- f2 | f2 = tan(f1) |
FASIN | f1 -- f2 | arc sine |
FACOS | f1 -- f2 | arc cosine |
FATAN | f1 -- f2 | arc tangent |
FATAN2 | f1 f2 -- f3 | f3 is arc tangent of f1/f2 |
S>F | n -- f | convert single integer to floating point number |
F>S | f -- n | convert floating point to integer by rounding; |
use FLOOR first if
truncation is desired |
||
NUMBER? | ^str -- d b | convert counted string to signed double number |
b is TRUE if successfull |
NUMBER?
may be used to translate
a counted string into a single length number by dropping
the top half of the returned double number. Other useful
conversion words for converting strings to numbers and
vice-versa are given in strings.4th.BASE | -- a | return the address containing current number base |
DECIMAL | -- | set the number base to ten |
BINARY | -- | set the number base to two |
HEX | -- | set the number base to sixteen |
KEY | -- n | wait for key press and return key code |
ACCEPT | a n1 -- n2 | read up to n1 characters into buffer a |
from keyboard. n2 is actual number input. | ||
. | n -- | display top item on the stack in the current base |
U. | u -- | display unsigned single in current base |
F. | f -- | display the floating point value on top of the stack |
.S | n1 n2 ... -- n1 n2 ... | non-destructive display of the stack |
." | -- | display text message; the message is read from |
the input stream and must be terminated by " | ||
CR | -- | output carriage return |
SPACES | n -- | output n spaces |
EMIT | n -- | output character with ascii value n |
TYPE | a n -- | display n characters from buffer at a |
PAGE
and other terminal control words
for ANSI terminals are provided in the form of source
code in ansi.4thOPEN | ^name n1 -- n2 | open file specified by counted string ^name |
in mode n1, which can be the following: | ||
0 read-only (R/O) | ||
1 write-only (W/O) | ||
2 read-write (R/W) | ||
n2 is the file descriptor, a non-negative | ||
integer if successful. | ||
LSEEK | n1 n2 n3 -- n4 | change current position in opened file |
n1 is the file descriptor | ||
n2 is the offset, and | ||
n3 is the mode with the following meaning: | ||
0 offset is relative to start of file | ||
1 offset is relative to current position | ||
2 offset is relative to end of file | ||
n4 is the resulting offset from the | ||
beginning of the file, or -1 if error. | ||
READ | n1 a n2 -- n3 | read n2 bytes into buffer address a, from |
file with descriptor n1. | ||
n3 is the number of bytes actually read. | ||
WRITE | n1 a n2 -- n3 | write n2 bytes from buffer address a to |
file with descriptor n1. | ||
n3 is the number of bytes actually written. | ||
CLOSE | n1 -- n2 | close file with descriptor n1 and return |
status n2 (0 if successful, -1 if error). | ||
IOCTL | n1 n2 a -- n3 | send device control request n2 to file |
with descriptor n1 (Linux only). Additional parameters | ||
are passed through buffer at address a. | ||
n3 is the status (0 if successful, -1 if error). |
CALL | a -- | call machine language subroutine at address a |
USLEEP | u -- | suspend execution for at least u microseconds |
(For Windows version, resolution is 1000) |