aboutsummaryrefslogtreecommitdiff
path: root/j1/toolchain/basewords.fs
blob: 6534d2b14a873753e176719418ecad5f5b3c2a10 (plain)
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
( 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 ;
: N>>T      h# 0900 ;
: N<<T      h# 0a00 ;
: rT        h# 0b00 ;
: [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 ;
: 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 tw, ;
: alu       h# 6000 or tw, ;
: ubranch   h# 0000 or tw, ;
: 0branch   h# 2000 or tw, ;
: scall     h# 4000 or tw, ;


:: noop      T                       alu ;
:: +         T+N                 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 ;
:: @         [T]                     alu ;
:: io@       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 ;
:: rshift    N>>T                d-1 alu ;
:: lshift    N<<T                d-1 alu ;
:: depths    status T->N         d+1 alu ;
:: exit      T  RET              r-1 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 ;
:: 2duprshift N>>T 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 ;
:: dup@      [T]   T->N          d+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 ;