-
Notifications
You must be signed in to change notification settings - Fork 56
/
basewords.fs
95 lines (87 loc) · 3.03 KB
/
basewords.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
( J1 base words implemented in assembler JCB 17:27 12/31/11)
: T h# 0000 ;
: N h# 0100 ;
: T+N h# 0200 ;
: T&N h# 0300 ;
: T|N h# 0400 ;
: T^N h# 0500 ;
: ~T h# 0600 ;
: N==T h# 0700 ;
: N<T h# 0800 ;
: T2/ h# 0900 ;
: T2* h# 0a00 ;
: rT h# 0b00 ;
: N-T h# 0c00 ;
: io[T] h# 0d00 ;
: status h# 0e00 ;
: Nu<T h# 0f00 ;
: T->N h# 0010 or ;
: T->R h# 0020 or ;
: N->[T] h# 0030 or ;
: N->io[T] h# 0040 or ;
: _IORD_ h# 0050 or ;
: RET h# 0080 or ;
: d-1 h# 0003 or ;
: d+1 h# 0001 or ;
: r-1 h# 000c or ;
: r-2 h# 0008 or ;
: r+1 h# 0004 or ;
: imm h# 8000 or tcode, ;
: alu h# 6000 or tcode, ;
: ubranch h# 0000 or tcode, ;
: 0branch h# 2000 or tcode, ;
: scall h# 4000 or tcode, ;
:: noop T alu ;
:: + T+N d-1 alu ;
:: - N-T d-1 alu ;
:: xor T^N d-1 alu ;
:: and T&N d-1 alu ;
:: or T|N d-1 alu ;
:: invert ~T alu ;
:: = N==T d-1 alu ;
:: < N<T d-1 alu ;
:: u< Nu<T d-1 alu ;
:: swap N T->N alu ;
:: dup T T->N d+1 alu ;
:: drop N d-1 alu ;
:: over N T->N d+1 alu ;
:: nip T d-1 alu ;
:: >r N T->R r+1 d-1 alu ;
:: r> rT T->N r-1 d+1 alu ;
:: r@ rT T->N d+1 alu ;
:: io@ T _IORD_ alu
io[T] alu ;
:: !
T N->[T] d-1 alu
N d-1 alu ;
:: io!
T N->io[T] d-1 alu
N d-1 alu ;
:: 2/ T2/ alu ;
:: 2* T2* alu ;
:: depth status T->N d+1 alu ;
:: exit T RET r-1 alu ;
:: hack T N->io[T] alu ;
\ Elided words
\ These words are supported by the hardware but are not
\ part of ANS Forth. They are named after the word-pair
\ that matches their effect
\ Using these elided words instead of
\ the pair saves one cycle and one instruction.
:: 2dupand T&N T->N d+1 alu ;
:: 2dup< N<T T->N d+1 alu ;
:: 2dup= N==T T->N d+1 alu ;
:: 2dupor T|N T->N d+1 alu ;
:: 2dup+ T+N T->N d+1 alu ;
:: 2dupu< Nu<T T->N d+1 alu ;
:: 2dupxor T^N T->N d+1 alu ;
:: dup>r T T->R r+1 alu ;
:: overand T&N alu ;
:: over> N<T alu ;
:: over= N==T alu ;
:: overor T|N alu ;
:: over+ T+N alu ;
:: overu> Nu<T alu ;
:: overxor T^N alu ;
:: rdrop T r-1 alu ;
:: tuck! T N->[T] d-1 alu ;