/
base.fs
175 lines (163 loc) · 5.3 KB
/
base.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
: \ IMMEDIATE 10 WORD DROP ;
: CR 10 EMIT ;
: TAB 9 EMIT ;
: SPACE 32 EMIT ;
: CMP 2DUP > ROT < - ;
: BIN IMMEDIATE 2 BASE ! ;
: DEC IMMEDIATE 10 BASE ! ;
: HEX IMMEDIATE 16 BASE ! ;
: . 0 .R SPACE ;
: U. 0 U.R SPACE ;
: LITERAL IMMEDIATE COMPILE-ONLY [ ' LIT , ] LIT , , ;
: ['] IMMEDIATE COMPILE-ONLY ' POSTPONE LITERAL ;
: IF IMMEDIATE COMPILE-ONLY POSTPONE 0BRANCH HERE @ >CTRL 0 , ;
: THEN IMMEDIATE COMPILE-ONLY CTRL> HERE @ OVER - /CELLS SWAP ! ;
: ELSE IMMEDIATE COMPILE-ONLY
POSTPONE BRANCH CTRL> HERE @ 0 , >CTRL HERE @ OVER - /CELLS SWAP !
;
: <=> 2DUP < IF -1 ELSE > IF 1 ELSE 0 THEN THEN ;
: CHAR 32 WORD 1+ C@ ;
: [CHAR] IMMEDIATE COMPILE-ONLY 32 WORD 1+ C@ POSTPONE LITERAL ;
: BEGIN IMMEDIATE COMPILE-ONLY HERE @ >CTRL ;
: UNTIL IMMEDIATE COMPILE-ONLY POSTPONE 0BRANCH CTRL> HERE @ - /CELLS , ;
: AGAIN IMMEDIATE COMPILE-ONLY POSTPONE BRANCH CTRL> HERE @ - /CELLS , ;
: WHILE IMMEDIATE COMPILE-ONLY POSTPONE 0BRANCH HERE @ >CTRL 0 , ;
: REPEAT IMMEDIATE COMPILE-ONLY
POSTPONE BRANCH 2CTRL> SWAP HERE @ - /CELLS , HERE @ OVER - /CELLS SWAP !
;
: RECURSE IMMEDIATE COMPILE-ONLY LATEST @ DE>CFA , ;
: ( IMMEDIATE
DEC 1 >R
BEGIN
R@ 0>
WHILE
KEY
DUP 40 = IF \ '('
R1+
ELSE
DUP 41 = IF \ ')'
R1-
THEN
THEN
DROP
REPEAT
R> DROP
;
: ALIGNED 3 + 3 INVERT AND ;
: ALIGN HERE @ ALIGNED HERE ! ;
: C, HERE @ C! 1 HERE +! ;
: ." IMMEDIATE COMPILE-ONLY
[ ' LITSTRING ] LITERAL ,
HERE @ 0 ,
BEGIN
34 KEY DUP ROT <>
WHILE
C,
DUP 1 SWAP +!
REPEAT
2DROP
ALIGN
[ ' TELL ] LITERAL ,
;
: VARIABLE CREATE 1 CELLS ALLOT ;
: CONSTANT CREATE DFA>CFA DOCON SWAP ! , ;
: EXIT IMMEDIATE COMPILE-ONLY 0 , ;
DEC 32 CONSTANT BL
: COUNT DUP 1+ SWAP C@ ;
: CTELL COUNT TELL ;
: SPACES BEGIN DUP 0> WHILE SPACE 1- REPEAT DROP ;
: @++ ( addr -- addr+1 n ) DUP @ SWAP 1 CELLS + SWAP ;
: C@++ ( caddr -- caddr+1 n ) DUP C@ SWAP 1+ SWAP ;
: DUMP ( caddr len -- ) HEX >R BEGIN R@ 0> WHILE C@++ 3 U.R R> 1- >R REPEAT CR R> 2DROP DEC ;
: VALUE CREATE DFA>CFA DOVAL SWAP ! , ;
: TO IMMEDIATE
BL WORD FIND DE>DFA
DUP DFA>CFA @ DOVAL <> IF ." Not a value!" CR EXIT THEN \ FIXME make this sane
STATE S_COMPILE = IF
POSTPONE LIT
,
POSTPONE !
ELSE
!
THEN
;
\ decompiler!
: XT-NAME 9 CELLS - COUNT F_HIDDEN F_IMMED F_COMPONLY OR OR INVERT AND ;
: CCOUNT DUP 1 CELLS + SWAP @ ;
: '."' 46 EMIT 34 EMIT SPACE ;
: 'S"' [ CHAR S ] LITERAL EMIT 34 EMIT SPACE ;
: SEE
BL WORD DUP FIND
DUP 0= IF ." (not found)" CR 2DROP EXIT THEN \ bail out if the word is not found
DUP DE>CFA @ DOCOL <> IF ." (native)" CR 2DROP EXIT THEN \ bail if its not a colon def
." :" SPACE SWAP COUNT TELL SPACE \ ": FOO "
DUP 1 CELLS + C@
DUP F_IMMED AND 0<> IF ." IMMEDIATE" SPACE THEN
DUP F_COMPONLY AND 0<> IF ." COMPILE-ONLY" SPACE THEN
DROP CR
DE>DFA DUP >R
BEGIN
DUP @ DUP 2 PICK R@ < OR
WHILE
DUP [ ' LIT ] LITERAL = IF
TAB 40 EMIT SPACE XT-NAME TELL SPACE 41 EMIT 3 SPACES
1 CELLS +
DUP @ . CR
ELSE
DUP [ ' LITSTRING ] LITERAL = IF
TAB 40 EMIT SPACE XT-NAME TELL SPACE
1 CELLS +
DUP @ 0 .R SPACE 41 EMIT
3 SPACES 'S"' DUP CCOUNT TUCK TELL 34 EMIT
DUP ALIGNED /CELLS 3 SPACES 40 EMIT SPACE . ." cells " 41 EMIT CR
ALIGNED +
ELSE
DUP [ ' 0BRANCH ] LITERAL = IF
TAB XT-NAME TELL SPACE
1 CELLS +
DUP @ DUP 0> IF
2DUP CELLS +
DUP R@ > IF R> SWAP >R THEN
DROP
THEN
DROP
DUP @ . CR
ELSE
DUP [ ' BRANCH ] LITERAL = IF
TAB XT-NAME TELL SPACE
1 CELLS +
DUP @ DUP 0> IF
2DUP CELLS +
DUP R@ > IF R> SWAP >R THEN
DROP
THEN
DROP
DUP @ . CR
ELSE
DUP 0= IF
DROP \ EXIT
TAB ." EXIT" CR
ELSE
TAB XT-NAME TELL CR
THEN
THEN
THEN
THEN
THEN
1 CELLS +
REPEAT
." ;" CR
R> 3 NDROP
;
: MARKER ( FIXME should be flagged "no compile" )
CREATE ( -- dfa )
DUP DFA>CFA DOCOL SWAP ! \ set the code field to DOCOL
DFA>DE ( dfa -- de )
DUP [ ' LIT ] LITERAL , , \ compile literal DE address
[ ' HERE ] LITERAL , [ ' ! ] LITERAL , \ compile HERE !
@ ( de -- link )
[ ' LIT ] LITERAL , , \ compile literal link address
[ ' LATEST ] LITERAL , [ ' ! ] LITERAL , \ compile LATEST !
[ 0 ] LITERAL , \ compile EXIT
;
MARKER reset