home .. forth .. misc mail list archive ..

nFORTH v2.3


Comments, folks?
nFORTH = nanoFORTH:  a viable stack-computer with 4-bit opcodes
-- perhaps the irreducible ultimate in "software DeMorgan-ization"?

v2.3  Feb 19, 1999  (this doc is verrry rough and crude)

(c) vic plichota, original concept by Myron Plichota Dec '98, polished over the MISC list.



OPCODE SUMMARY:

add	.equ	0
nand	.equ	1
xor	.equ	2
ashr	.equ	3
fetch	.equ	4
store	.equ	5
lit	.equ	6
dup	.equ	7
swap	.equ	8
drop	.equ	9
tor	.equ	10
rfrom	.equ	11
enter	.equ	12
exit	.equ	13
zjmp	.equ	14
iptor	.equ	15




(an almost) FORMAL DESCRIPTION:

GLOSSARY:
AKA:  Also Known As
cell-size:  the nFORTH machine-implementation's native integer format
iff:  "if and only if"
ILK:  'immediate' in-line constant, with the same number of bits as the cell-size
IP:  the Instruction Pointer, AKA 'program counter'
N:  Next-from-top entry on parameter-stack
R:  Top entry on return-stack
T:  Top entry on parameter-stack
(. . .):  parameter-stack diagram
<. . .>:  return-stack diagram
|:  pipe char used to indicate an "either-or" choice



0:
add	AKA  '+', "plus"
(n1, n2 -- n3)


1:
nand	AKA  '&~'
(x1, x2 -- x3)


2:
xor	AKA  '><'
(x1, x2 -- x3)


3:
ashr	AKA  '2/', "two-div", "two-slash", '>>';  arithmetic shift-right
(n1 -- n2)


4:
fetch	AKA  '@', "peek"
(addr --- x)


5:
store	AKA  '!', "poke"
(x, addr --  )


6:
lit	;  "push literal";  in-line immediate constant --> T
(  -- ILK)


7:
dup	; duplicate T
(x -- x, x)


8:
swap	; exchange T with N
(x, y -- y, x)


9:
drop	; pop and discard T
(x --  )


10:
tor	AKA  '>R', "to-R";  transfer T to R
(x --  )
<  -- x>


11:
rfrom	AKA  'R>', "R-from";  transfer R to T
(  -- x)
<x --  >


12:
enter	AKA  ':', "docol", "nest", "call";  enter procedure
<  -- IP>,  ILK-->IP


13:
exit	AKA  ';', "semis", "return";  un-nest procedure level
<x --  >,  x-->IP


14:
zjmp	; jump to ILK iff T=0
(x --  ),  T=N:  ILK-->IP  |  T<>0:  IP+native cell-size -->IP


15:
iptor	AKA 'begin'  ; push IP (next instruction fetch addr) to R
<  -- IP>




DERIVED OPERATIONS (some examples)


_ddrop:   drop drop exit

_rot:   tor swap rfrom swap exit

_over:   tor dup rfrom swap exit

_not:   dup nand exit

_and:  nand dup nand exit

_or:   dup nand swap dup nand nand exit

_negate:   dup nand lit 1 add exit

_subtract:  dup nand lit 1 add add exit

_nondestructive-subtract:   enter _over enter _over enter _subtract exit

_shl:   dup add exit		;  AKA  '2*', "two-star", '<<';  shift-left