swapforth
1: \ source nip >in ! ; immediate \ Now can use comments!
2\
3\ This file contains definitions in high-level Forth for the
4\ rest of Swapforth. Many words were already defined in
5\ nucleus -- this file fills in the gaps.
6\
7\ This file is divided into sections for each word set in ANS
8\ Forth.
9\
10\ The only definitions in this file should be specific to
11\ Swapforth Python (sfpy).
12
13\ ####### CORE AND DOUBLE #################################
14include core0.fs
15
16: 2>r r> -rot swap >r >r >r ;
17: 2r>
18postpone r>
19postpone r>
20postpone swap
21; immediate
22: 2r@ r> 2r> 2dup 2>r rot >r ;
23
24: >body
258 + @
26;
27
28: ( ')' parse 2drop ; immediate
29
30: dabs dup 0< if dnegate then ;
31: d0= or 0= ;
32: 2rot >r >r 2swap r> r> 2swap ;
33
34include double.fs
35include core.fs
36
37: /mod >r s>d r> sm/rem ;
38: / /mod nip ;
39: mod /mod drop ;
40
41\ ####### CORE EXT ########################################
42
43: s, dup c, bounds ?do i c@ c, loop ;
44
45: c"
46here postpone literal
47[char] " parse
48s,
49; immediate
50
51: sliteral
52here postpone literal
53s,
54postpone count
55; immediate
56
57: (.")
58count type
59;
60
61: ."
62[char] " parse
63state @ if
64here postpone literal
65s,
66postpone (.")
67else
68type
69then
70; immediate
71
72
73: unused here negate ;
74: pad here aligned ;
75
76include core-ext0.fs
77include core-ext.fs
78
79: flashblank ( addr -- )
80flashbase -
8112 rshift \ sector number
82spi_flash_erase_sector throw ;
83
84: saligned ( a0 -- a1 ) \ a1 is sector-aligned address
854095 + -4096 and ;
86
87: marker
88forth @ dp @ cp @
89dup saligned cp ! \ Start a new sector
90create
91, , ,
92does>
93cp @ over @ saligned begin
942dup u>
95while
96cr ." blanking " over .x dup .x
97dup flashblank
984096 +
99repeat 2drop
100dup @ cp !
101cell+ dup @ dp !
102cell+ @ forth !
103;
104
105: floats cells ;
106: faligned aligned ;
107
108: LOCALWORDS ;
109: PUBLICWORDS ;
110: DONEWORDS ;
111
112include string0.fs
113include string.fs
114include tools-ext.fs
115include value.fs
116include deferred.fs
117include forth2012.fs
118include structures.fs
119include escaped.fs
120
121include runtests.fs
122
123#bye
124
125: .xt ( xt -- ) \ print xt's name
126>r
127forth @
128begin
129dup 0= if
130r> 2drop exit
131then
132dup
1332 +
134count + caligned
135uw@ r@ <>
136while
137uw@ -2 and
138repeat
139r> drop
1402 + count type
141;
142
143create op4 \ 4-bit field names, bits [11:8]
144s" T" s,
145s" N" s,
146s" T+N" s,
147s" T&N" s,
148s" T|N" s,
149s" T^N" s,
150s" ~T" s,
151s" N==T" s,
152s" N<T" s,
153s" N>>T" s,
154s" N<<T" s,
155s" rT" s,
156s" [T]" s,
157s" io[T]" s,
158s" status" s,
159s" Nu<T" s,
160
161create op3 \ 3-bit operation, bits [6:4]
162s" " s,
163s" T->N" s,
164s" T->R" s,
165s" N->[T]" s,
166s" N->io[T]" s,
167s" _IORD_" s,
168
169create opr \ 2-bit R stack delta, bits [3:2]
170s" " s,
171s" r+1" s,
172s" " s,
173s" r-1" s,
174
175create opd \ 2-bit D stack delta, bits [1:0]
176s" " s,
177s" d+1" s,
178s" " s,
179s" d-1" s,
180
181: skip." ( addr u -- ) \ skip u strings, then print
1820 ?do
183count +
184loop (.")
185space
186;
187
188: .alu
189." ALU "
190
191op4 over 8 rshift skip."
192
193op3 over 4 rshift 7 and skip."
194
195opr over 2 rshift 3 and skip."
196
197opd over 3 and skip."
198
199space
200$80 and if ." ;" then
201;
202
203\ Construct a 4-entry jump table J1op
204\ for the four J1 opcodes
205
206( 3:ALU ) :noname 2/ .alu ;
207( 2:CALL ) ' .xt \ print xt's name
208( 1:0BRANCH ) :noname [char] Z emit space . ;
209( 0:JUMP ) :noname [char] J emit space . ;
210create J1op , , , ,
211
212: dis ( addr -- )
213base @ swap hex
21464 bounds
215begin
216cr dup .
217dup uw@
218dup 4 .r space
219dup 15 rshift if
22032767 and
221[char] $ emit dup .
222decimal
223[char] # emit .
224hex
225else
226dup 8191 and 2* swap
22713 rshift cells J1op + @ execute
228then
2292 +
2302dup =
231until
2322drop
233base !
234;
235
236: see ' dis ;
237
238: environment?
2392drop false
240;
241
242\ ####### DEFERRED WORDS #################################
243
244: defer ( "name" -- )
245: ['] abort compile, postpone ; ;
246
247: defer@ ( xt1 -- xt2 )
248uw@ 2* ;
249
250: defer! ( xt2 xt1 -- )
251swap 2/ swap w! ;
252
253: is
254state @ if
255POSTPONE ['] POSTPONE defer!
256else
257' defer!
258then ; immediate
259
260: action-of
261state @ if
262POSTPONE ['] POSTPONE defer@
263else
264' defer@
265then ; immediate
266
267\ ####### EVERYTHING ELSE #################################
268
269include float0.fs
270include value.fs
271include exception.fs
272include facilityext.fs
273
274
275include forth2012.fs
276
277\ include memory.fs
278
279include comus.fs
280include mini-oof.fs
281
282include drivers/gpio.fs
283include drivers/spi.fs
284include drivers/time.fs
285
286: new
287s" | marker |" evaluate
288;
289marker |
290