mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
112 lines
5.0 KiB
Plaintext
112 lines
5.0 KiB
Plaintext
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'
|
||
|