mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
5.0 KiB
112 lines
5.0 KiB
TABLE 1. GLOSSARY OF WORDS IN CAMEL80.AZM
|
|
Words which are (usually) written in CODE.
|
|
|
|
NAME stack in -- stack out description
|
|
|
|
Guide to stack diagrams: R: = return stack,
|
|
c = 8-bit character, flag = boolean (0 or -1),
|
|
n = signed 16-bit, u = unsigned 16-bit,
|
|
d = signed 32-bit, ud = unsigned 32-bit,
|
|
+n = unsigned 15-bit, x = any cell value,
|
|
i*x j*x = any number of cell values,
|
|
a-addr = aligned adrs, c-addr = character adrs
|
|
p-addr = I/O port adrs, sys = system-specific.
|
|
Refer to ANS Forth document for more details.
|
|
|
|
ANS Forth Core words
|
|
These are required words whose definitions are
|
|
specified by the ANS Forth document.
|
|
|
|
! x a-addr -- store cell in memory
|
|
+ n1/u1 n2/u2 -- n3/u3 add n1+n2
|
|
+! n/u a-addr -- add cell to memory
|
|
- n1/u1 n2/u2 -- n3/u3 subtract n1-n2
|
|
< n1 n2 -- flag test n1<n2, signed
|
|
= x1 x2 -- flag test x1=x2
|
|
> n1 n2 -- flag test n1>n2, signed
|
|
>R x -- R: -- x push to return stack
|
|
?DUP x -- 0 | x x DUP if nonzero
|
|
@ a-addr -- x fetch cell from memory
|
|
0< n -- flag true if TOS negative
|
|
0= n/u -- flag return true if TOS=0
|
|
1+ n1/u1 -- n2/u2 add 1 to TOS
|
|
1- n1/u1 -- n2/u2 subtract 1 from TOS
|
|
2* x1 -- x2 arithmetic left shift
|
|
2/ x1 -- x2 arithmetic right shift
|
|
AND x1 x2 -- x3 logical AND
|
|
CONSTANT n -- define a Forth constant
|
|
C! c c-addr -- store char in memory
|
|
C@ c-addr -- c fetch char from memory
|
|
DROP x -- drop top of stack
|
|
DUP x -- x x duplicate top of stack
|
|
EMIT c -- output character to console
|
|
EXECUTE i*x xt -- j*x execute Forth word 'xt'
|
|
EXIT -- exit a colon definition
|
|
FILL c-addr u c -- fill memory with char
|
|
I -- n R: sys1 sys2 -- sys1 sys2
|
|
get the innermost loop index
|
|
INVERT x1 -- x2 bitwise inversion
|
|
J -- n R: 4*sys -- 4*sys
|
|
get the second loop index
|
|
KEY -- c get character from keyboard
|
|
LSHIFT x1 u -- x2 logical L shift u places
|
|
NEGATE x1 -- x2 two's complement
|
|
OR x1 x2 -- x3 logical OR
|
|
OVER x1 x2 -- x1 x2 x1 per stack diagram
|
|
ROT x1 x2 x3 -- x2 x3 x1 per stack diagram
|
|
RSHIFT x1 u -- x2 logical R shift u places
|
|
R> -- x R: x -- pop from return stack
|
|
R@ -- x R: x -- x fetch from rtn stk
|
|
SWAP x1 x2 -- x2 x1 swap top two items
|
|
UM* u1 u2 -- ud unsigned 16x16->32 mult.
|
|
UM/MOD ud u1 -- u2 u3 unsigned 32/16->16 div.
|
|
UNLOOP -- R: sys1 sys2 -- drop loop parms
|
|
U< u1 u2 -- flag test u1<n2, unsigned
|
|
VARIABLE -- define a Forth variable
|
|
XOR x1 x2 -- x3 logical XOR
|
|
|
|
ANS Forth Extensions
|
|
These are optional words whose definitions are
|
|
specified by the ANS Forth document.
|
|
|
|
<> x1 x2 -- flag test not equal
|
|
BYE i*x -- return to CP/M
|
|
CMOVE c-addr1 c-addr2 u -- move from bottom
|
|
CMOVE> c-addr1 c-addr2 u -- move from top
|
|
KEY? -- flag return true if char waiting
|
|
M+ d1 n -- d2 add single to double
|
|
NIP x1 x2 -- x2 per stack diagram
|
|
TUCK x1 x2 -- x2 x1 x2 per stack diagram
|
|
U> u1 u2 -- flag test u1>u2, unsigned
|
|
|
|
Private Extensions
|
|
These are words which are unique to CamelForth.
|
|
Many of these are necessary to implement ANS
|
|
Forth words, but are not specified by the ANS
|
|
document. Others are functions I find useful.
|
|
|
|
(do) n1|u1 n2|u2 -- R: -- sys1 sys2
|
|
run-time code for DO
|
|
(loop) R: sys1 sys2 -- | sys1 sys2
|
|
run-time code for LOOP
|
|
(+loop) n -- R: sys1 sys2 -- | sys1 sys2
|
|
run-time code for +LOOP
|
|
>< x1 -- x2 swap bytes
|
|
?branch x -- branch if TOS zero
|
|
BDOS DE C -- A call CP/M BDOS
|
|
branch -- branch always
|
|
lit -- x fetch inline literal to stack
|
|
PC! c p-addr -- output char to port
|
|
PC@ p-addr -- c input char from port
|
|
RP! a-addr -- set return stack pointer
|
|
RP@ -- a-addr get return stack pointer
|
|
SCAN c-addr1 u1 c -- c-addr2 u2
|
|
find matching char
|
|
SKIP c-addr1 u1 c -- c-addr2 u2
|
|
skip matching chars
|
|
SP! a-addr -- set data stack pointer
|
|
SP@ -- a-addr get data stack pointer
|
|
S= c-addr1 c-addr2 u -- n string compare
|
|
n<0: s1<s2, n=0: s1=s2, n>0: s1>s2
|
|
USER n -- define user variable 'n'
|
|
|