[gforth] / gforth / cross.fs  

gforth: gforth/cross.fs


1 : anton 1.1 \ CROSS.FS The Cross-Compiler 06oct92py
2 : pazsan 1.8 \ $Id: cross.fs,v 1.7 1994/07/08 15:00:30 anton Exp $
3 : anton 1.1 \ Idea and implementation: Bernd Paysan (py)
4 :     \ Copyright 1992 by the ANSI figForth Development Group
5 :    
6 :     \ Log:
7 :     \ changed in ; [ to state off 12may93jaw
8 :     \ included place +place 12may93jaw
9 :     \ for a created word (variable, constant...)
10 :     \ is now an alias in the target voabulary.
11 :     \ this means it is no longer necessary to
12 :     \ switch between vocabularies for variable
13 :     \ initialization 12may93jaw
14 :     \ discovered error in DOES>
15 :     \ replaced !does with (;code) 16may93jaw
16 :     \ made complete redesign and
17 :     \ introduced two vocs method
18 :     \ to be asure that the right words
19 :     \ are found 08jun93jaw
20 :     \ btw: ! works not with 16 bit
21 :     \ targets 09jun93jaw
22 :     \ added: 2user and value 11jun93jaw
23 :    
24 : pazsan 1.9 \ include other.fs \ ansforth extentions for cross
25 : anton 1.1
26 : pazsan 1.5 : comment? ( c-addr u -- c-addr u )
27 :     2dup s" (" compare 0=
28 :     IF postpone (
29 :     ELSE 2dup s" \" compare 0= IF postpone \ THEN
30 :     THEN ;
31 :    
32 : anton 1.1 decimal
33 :    
34 :     \ Begin CROSS COMPILER:
35 :    
36 :     \ GhostNames 9may93jaw
37 :     \ second name source to search trough list
38 :    
39 :     VARIABLE GhostNames
40 :     0 GhostNames !
41 :     : GhostName ( -- addr )
42 :     here GhostNames @ , GhostNames ! here 0 ,
43 :     name count
44 :     \ 2dup type space
45 :     dup c, here over chars allot swap move align ;
46 :    
47 :     hex
48 :    
49 :    
50 :     Vocabulary Cross
51 :     Vocabulary Target
52 :     Vocabulary Ghosts
53 :     VOCABULARY Minimal
54 :     only Forth also Target also also
55 :     definitions Forth
56 :    
57 :     : T previous Cross also Target ; immediate
58 :     : G Ghosts ; immediate
59 :     : H previous Forth also Cross ; immediate
60 :    
61 :     forth definitions
62 :    
63 :     : T previous Cross also Target ; immediate
64 :     : G Ghosts ; immediate
65 :    
66 :     : >cross also Cross definitions previous ;
67 :     : >target also Target definitions previous ;
68 :     : >minimal also Minimal definitions previous ;
69 :    
70 :     H
71 :    
72 :     >CROSS
73 :    
74 :     \ Variables 06oct92py
75 :    
76 :     -1 Constant NIL
77 :     Variable image
78 :     Variable tlast NIL tlast ! \ Last name field
79 :     Variable tlastcfa \ Last code field
80 :     Variable tdoes \ Resolve does> calls
81 :     Variable bit$
82 :     Variable tdp
83 :     : there tdp @ ;
84 :    
85 :     \ Parameter for target systems 06oct92py
86 :    
87 :     include machine.fs
88 :    
89 :     >TARGET
90 :    
91 :     \ Byte ordering and cell size 06oct92py
92 :    
93 :     : cell+ cell + ;
94 :     : cells cell<< lshift ;
95 :     : chars ;
96 : anton 1.6 : floats float * ;
97 :    
98 : anton 1.1 >CROSS
99 :     : cell/ cell<< rshift ;
100 :     >TARGET
101 :     20 CONSTANT bl
102 :     -1 Constant NIL
103 :     -2 Constant :docol
104 :     -3 Constant :docon
105 :     -4 Constant :dovar
106 : pazsan 1.3 -5 Constant :douser
107 :     -6 Constant :dodoes
108 :     -7 Constant :doesjump
109 : anton 1.1
110 :     >CROSS
111 :    
112 :     endian 0 pad ! -1 pad c! pad @ 0<
113 :     = [IF] : bswap ; immediate
114 :     [ELSE] : bswap ( big / little -- little / big ) 0
115 :     cell 1- FOR bits/byte lshift over
116 :     [ 1 bits/byte lshift 1- ] Literal and or
117 :     swap bits/byte rshift swap NEXT nip ;
118 :     [THEN]
119 :    
120 :     \ Memory initialisation 05dec92py
121 :     \ Fixed bug in else part 11may93jaw
122 :    
123 :     [IFDEF] Memory \ Memory is a bigFORTH feature
124 : pazsan 1.5 also Memory
125 : anton 1.1 : initmem ( var len -- )
126 :     2dup swap handle! >r @ r> erase ;
127 : pazsan 1.5 toss
128 : anton 1.1 [ELSE]
129 :     : initmem ( var len -- )
130 :     tuck allocate abort" CROSS: No memory for target"
131 :     ( len var adr ) dup rot !
132 :     ( len adr ) swap erase ;
133 :     [THEN]
134 :    
135 :     \ MakeKernal 12dec92py
136 :    
137 :     >MINIMAL
138 :     : makekernal ( targetsize -- targetsize )
139 :     bit$ over 1- cell>bit rshift 1+ initmem
140 :     image over initmem tdp off ;
141 :    
142 :     >CROSS
143 :     \ Bit string manipulation 06oct92py
144 :     \ 9may93jaw
145 :     CREATE Bittable 80 c, 40 c, 20 c, 10 c, 8 c, 4 c, 2 c, 1 c,
146 :     : bits ( n -- n ) chars Bittable + c@ ;
147 :    
148 :     : >bit ( addr n -- c-addr mask ) 8 /mod rot + swap bits ;
149 :     : +bit ( addr n -- ) >bit over c@ or swap c! ;
150 : pazsan 1.4 : -bit ( addr n -- ) >bit invert over c@ and swap c! ;
151 : anton 1.1 : relon ( taddr -- ) bit$ @ swap cell/ +bit ;
152 : pazsan 1.4 : reloff ( taddr -- ) bit$ @ swap cell/ -bit ;
153 : anton 1.1
154 :     \ Target memory access 06oct92py
155 :    
156 :     : align+ ( taddr -- rest )
157 :     cell tuck 1- and - [ cell 1- ] Literal and ;
158 :    
159 :     >TARGET
160 :     : aligned ( taddr -- ta-addr ) dup align+ + ;
161 :     \ assumes cell alignment granularity (as GNU C)
162 :    
163 :     >CROSS
164 :     : >image ( taddr -- absaddr ) image @ + ;
165 :     >TARGET
166 :     : @ ( taddr -- w ) >image @ bswap ;
167 :     : ! ( w taddr -- ) >r bswap r> >image ! ;
168 :     : c@ ( taddr -- char ) >image c@ ;
169 :     : c! ( char taddr -- ) >image c! ;
170 : anton 1.7 : 2@ ( taddr -- x1 x2 ) T dup cell+ @ swap @ H ;
171 :     : 2! ( x1 x2 taddr -- ) T swap over ! cell+ ! H ;
172 : anton 1.1
173 :     \ Target compilation primitives 06oct92py
174 :     \ included A! 16may93jaw
175 :    
176 :     : here ( -- there ) there ;
177 :     : allot ( n -- ) tdp +! ;
178 :     : , ( w -- ) T here H cell T allot ! H ;
179 :     : c, ( char -- ) T here 1 allot c! H ;
180 :     : align ( -- ) T here H align+ 0 ?DO bl T c, H LOOP ;
181 :    
182 :     : A! dup relon T ! H ;
183 :     : A, ( w -- ) T here H relon T , H ;
184 :    
185 :     >CROSS
186 :    
187 :     \ threading modell 13dec92py
188 :    
189 :     \ generic threading modell
190 :     : docol, ( -- ) :docol T A, 0 , H ;
191 :    
192 :     >TARGET
193 :     : >body ( cfa -- pfa ) T cell+ cell+ H ;
194 :     >CROSS
195 :    
196 : pazsan 1.3 : dodoes, ( -- ) T :doesjump A, 0 , H ;
197 : anton 1.1
198 :     \ Ghost Builder 06oct92py
199 :    
200 :     \ <T T> new version with temp variable 10may93jaw
201 :    
202 :     VARIABLE VocTemp
203 :    
204 :     : <T get-current VocTemp ! also Ghosts definitions ;
205 :     : T> previous VocTemp @ set-current ;
206 :    
207 :     4711 Constant <fwd> 4712 Constant <res>
208 :     4713 Constant <imm>
209 :    
210 :     \ iForth makes only immediate directly after create
211 :     \ make atonce trick! ?
212 :    
213 :     Variable atonce atonce off
214 :    
215 :     : NoExec true ABORT" CROSS: Don't execute ghost" ;
216 :    
217 :     : GhostHeader <fwd> , 0 , ['] NoExec , ;
218 :    
219 :     : >magic ; : >link cell+ ; : >exec cell+ cell+ ;
220 :     : >end 3 cells + ;
221 :    
222 :     : Make-Ghost ( "name" -- ghost )
223 :     >in @ GhostName swap >in !
224 :     <T Create atonce @ IF immediate atonce off THEN
225 :     here tuck swap ! ghostheader T>
226 :     DOES> >exec @ execute ;
227 :    
228 :     \ ghost words 14oct92py
229 :     \ changed: 10may93py/jaw
230 :    
231 :     : gfind ( string -- ghost true/1 / string false )
232 :     \ searches for string in word-list ghosts
233 :     \ !! wouldn't it be simpler to just use search-wordlist ? ae
234 : pazsan 1.5 dup count [ ' ghosts >body ] ALiteral search-wordlist
235 :     \ >r get-order 0 set-order also ghosts r> find >r >r
236 :     >r r@ IF >body nip THEN r> ;
237 :     \ set-order r> r@ IF >body THEN r> ;
238 : anton 1.1
239 :     VARIABLE Already
240 :    
241 :     : ghost ( "name" -- ghost )
242 :     Already off
243 :     >in @ name gfind IF Already on nip EXIT THEN
244 :     drop >in ! Make-Ghost ;
245 :    
246 :     \ resolve 14oct92py
247 :    
248 :     : resolve-loop ( ghost tcfa -- ghost tcfa )
249 :     >r dup >link @
250 :     BEGIN dup WHILE dup T @ H r@ rot T ! H REPEAT drop r> ;
251 :    
252 :     \ exists 9may93jaw
253 :    
254 :     : exists ( ghost tcfa -- )
255 :     over GhostNames
256 :     BEGIN @ dup
257 :     WHILE 2dup cell+ @ =
258 :     UNTIL
259 :     nip 2 cells + count cr ." CROSS: Exists: " type 4 spaces
260 :     swap cell+ !
261 :     ELSE true ABORT" CROSS: Ghostnames inconsistent"
262 :     THEN ;
263 :    
264 :     : resolve ( ghost tcfa -- )
265 :     over >magic @ <fwd> <> IF exists EXIT THEN
266 :     resolve-loop over >link ! <res> swap >magic ! ;
267 :    
268 :     \ gexecute ghost, 01nov92py
269 :    
270 :     : do-forward ( ghost -- )
271 :     >link dup @ there rot ! T A, H ;
272 :     : do-resolve ( ghost -- )
273 :     >link @ T A, H ;
274 :    
275 :     : gexecute ( ghost -- ) dup @
276 :     <fwd> = IF do-forward ELSE do-resolve THEN ;
277 :     : ghost, ghost gexecute ;
278 :    
279 :     \ .unresolved 11may93jaw
280 :    
281 :     variable ResolveFlag
282 :    
283 :     \ ?touched 11may93jaw
284 :    
285 :     : ?touched ( ghost -- flag ) dup >magic @ <fwd> = swap >link @
286 :     0 <> and ;
287 :    
288 :     : ?resolved ( ghostname -- )
289 :     dup cell+ @ ?touched
290 :     IF cell+ cell+ count cr type ResolveFlag on ELSE drop THEN ;
291 :    
292 :     >MINIMAL
293 :     : .unresolved ( -- )
294 :     ResolveFlag off cr ." Unresolved: "
295 :     Ghostnames
296 :     BEGIN @ dup
297 :     WHILE dup ?resolved
298 :     REPEAT drop ResolveFlag @ 0= IF ." Nothing!" THEN cr ;
299 :    
300 :     >CROSS
301 :     \ Header states 12dec92py
302 :    
303 :     : flag! ( 8b -- ) tlast @ dup >r T c@ xor r> c! H ;
304 :    
305 :     VARIABLE ^imm
306 :    
307 :     >TARGET
308 :     : immediate 20 flag!
309 :     ^imm @ @ dup <imm> = ?EXIT
310 :     <res> <> ABORT" CROSS: Cannot immediate a unresolved word"
311 :     <imm> ^imm @ ! ;
312 : pazsan 1.8 : restrict 40 flag! ;
313 : anton 1.1 >CROSS
314 :    
315 :     \ ALIAS2 ansforth conform alias 9may93jaw
316 :    
317 :     : ALIAS2 create here 0 , DOES> @ execute ;
318 :     \ usage:
319 :     \ ' alias2 bla !
320 :    
321 :     \ Target Header Creation 01nov92py
322 :    
323 :     : string, ( addr count -- )
324 :     dup T c, H bounds DO I c@ T c, H LOOP ;
325 :     : name, ( "name" -- ) name count string, T align H ;
326 :     : view, ( -- ) ( dummy ) ;
327 :    
328 :     VARIABLE CreateFlag CreateFlag off
329 :    
330 :     : (Theader ( "name" -- ghost ) T align H view,
331 :     tlast @ dup 0> IF T 1 cells - THEN A, H there tlast !
332 :     >in @ name, >in ! T here H tlastcfa !
333 :     CreateFlag @ IF
334 :     >in @ alias2 swap >in ! \ create alias in target
335 :     >in @ ghost swap >in !
336 :     swap also ghosts ' previous swap ! \ tick ghost and store in alias
337 :     CreateFlag off
338 :     ELSE ghost THEN
339 :     dup >magic ^imm ! \ a pointer for immediate
340 :     Already @ IF dup >end tdoes !
341 :     ELSE 0 tdoes ! THEN
342 :     80 flag! ;
343 :    
344 :     VARIABLE ;Resolve 1 cells allot
345 :    
346 :     : Theader ( "name" -- ) (THeader there resolve 0 ;Resolve ! ;
347 :    
348 :     >TARGET
349 :     : Alias ( cfa -- ) \ name
350 :     (THeader over resolve T A, H 80 flag! ;
351 :     >CROSS
352 :    
353 :     \ Conditionals and Comments 11may93jaw
354 :    
355 :     : ;Cond
356 :     postpone ;
357 :     swap ! ; immediate
358 :    
359 :     : Cond: ( -- ) \ name {code } ;
360 :     atonce on
361 :     ghost
362 :     >exec
363 :     :NONAME ;
364 :    
365 :     : restrict? ( -- )
366 :     \ aborts on interprete state - ae
367 :     state @ 0= ABORT" CROSS: Restricted" ;
368 :    
369 :     : Comment ( -- )
370 :     >in @ atonce on ghost swap >in ! ' swap >exec ! ;
371 :    
372 :     Comment ( Comment \
373 :    
374 :     \ Predefined ghosts 12dec92py
375 :    
376 :     ghost 0= drop
377 :     ghost branch ghost ?branch 2drop
378 :     ghost (do) ghost (?do) 2drop
379 :     ghost (for) drop
380 :     ghost (loop) ghost (+loop) 2drop
381 :     ghost (next) drop
382 : pazsan 1.2 ghost unloop ghost ;S 2drop
383 : anton 1.1 ghost lit ghost (compile) ghost ! 2drop drop
384 :     ghost (;code) ghost noop 2drop
385 :     ghost (.") ghost (S") ghost (ABORT") 2drop drop
386 : pazsan 1.9 ghost '
387 : anton 1.1
388 :     \ compile 10may93jaw
389 :    
390 :     : compile ( -- ) \ name
391 :     restrict?
392 :     name gfind dup 0= ABORT" CROSS: Can't compile "
393 :     0> ( immediate? )
394 :     IF >exec @ compile,
395 :     ELSE postpone literal postpone gexecute THEN ;
396 :     immediate
397 :    
398 :     >TARGET
399 :     : ' ( -- cfa ) name gfind 0= ABORT" CROSS: undefined "
400 :     dup >magic @ <fwd> = ABORT" CROSS: forward " >link @ ;
401 :    
402 :     Cond: ['] compile lit ghost gexecute ;Cond
403 :    
404 :     >CROSS
405 :     \ tLiteral 12dec92py
406 :    
407 :     : lit, ( n -- ) compile lit T , H ;
408 :     : alit, ( n -- ) compile lit T A, H ;
409 :    
410 :     >TARGET
411 :     Cond: Literal ( n -- ) restrict? lit, ;Cond
412 :     Cond: ALiteral ( n -- ) restrict? alit, ;Cond
413 :    
414 :     : Char ( "<char>" -- ) bl word char+ c@ ;
415 :     Cond: [Char] ( "<char>" -- ) restrict? Char lit, ;Cond
416 :    
417 :     >CROSS
418 :     \ Target compiling loop 12dec92py
419 :     \ ">tib trick thrown out 10may93jaw
420 :     \ number? defined at the top 11may93jaw
421 :    
422 :     \ compiled word might leave items on stack!
423 :     : tcom ( in name -- )
424 :     gfind ?dup IF 0> IF nip >exec @ execute
425 :     ELSE nip gexecute THEN EXIT THEN
426 :     number? dup IF 0> IF swap lit, THEN lit, drop
427 :     ELSE 2drop >in !
428 :     ghost gexecute THEN ;
429 :    
430 :     >TARGET
431 :     \ : ; DOES> 13dec92py
432 :     \ ] 9may93py/jaw
433 :    
434 :     : ] state on
435 :     BEGIN
436 :     BEGIN >in @ name
437 :     dup c@ 0= WHILE 2drop refill 0=
438 :     ABORT" CROSS: End of file while target compiling"
439 :     REPEAT
440 :     tcom
441 :     state @
442 :     0=
443 :     UNTIL ;
444 :    
445 :     \ by the way: defining a second interpreter (a compiler-)loop
446 :     \ is not allowed if a system should be ans conform
447 :    
448 :     : : ( -- colon-sys ) \ Name
449 :     (THeader ;Resolve ! there ;Resolve cell+ !
450 :     docol, depth T ] H ;
451 :    
452 : pazsan 1.2 Cond: EXIT ( -- ) restrict? compile ;S ;Cond
453 : anton 1.6
454 :     Cond: ?EXIT ( -- ) 1 abort" CROSS: using ?exit" ;Cond
455 : pazsan 1.2
456 : anton 1.1 Cond: ; ( -- ) restrict?
457 :     depth ?dup IF 1- <> ABORT" CROSS: Stack changed"
458 :     ELSE true ABORT" CROSS: Stack empty" THEN
459 : pazsan 1.2 compile ;S state off
460 : anton 1.1 ;Resolve @
461 :     IF ;Resolve @ ;Resolve cell+ @ resolve THEN
462 :     ;Cond
463 :     Cond: [ restrict? state off ;Cond
464 :    
465 :     >CROSS
466 :     : !does :dodoes tlastcfa @ tuck T ! cell+ ! H ;
467 :    
468 :     >TARGET
469 :     Cond: DOES> restrict?
470 :     compile (;code) dodoes, tdoes @ ?dup IF @ T here H resolve THEN
471 :     ;Cond
472 :     : DOES> dodoes, T here H !does depth T ] H ;
473 :    
474 :     >CROSS
475 :     \ Creation 01nov92py
476 :    
477 :     \ Builder 11may93jaw
478 :    
479 :     : Builder ( Create do: "name" -- )
480 :     >in @ alias2 swap dup >in ! >r >r
481 :     Make-Ghost rot swap >exec ! ,
482 :     r> r> >in !
483 :     also ghosts ' previous swap !
484 :     DOES> dup >exec @ execute ;
485 :    
486 :     : gdoes, ( ghost -- ) >end @ dup >magic @ <fwd> <>
487 :     IF dup >link @ dup 0< IF T A, 0 , H drop EXIT THEN drop THEN
488 : pazsan 1.4 :dodoes T A, H gexecute T here H cell - reloff ;
489 : anton 1.1
490 :     : TCreate ( ghost -- )
491 :     CreateFlag on
492 :     Theader dup gdoes,
493 :     >end @ >exec @ execute ;
494 :    
495 :     : Build: ( -- [xt] [colon-sys] )
496 :     :noname postpone TCreate ;
497 :    
498 :     : gdoes> ( ghost -- addr flag )
499 :     state @ IF gexecute true EXIT THEN
500 :     cell+ @ T >body H false ;
501 :    
502 :     \ DO: ;DO 11may93jaw
503 :     \ changed to ?EXIT 10may93jaw
504 :    
505 :     : (does>) postpone does> ; immediate \ second level does>
506 :    
507 :     : DO: ( -- addr [xt] [colon-sys] )
508 :     here ghostheader
509 :     :noname
510 :     postpone (does>) postpone gdoes> postpone ?EXIT ;
511 :    
512 :     : ;DO ( addr [xt] [colon-sys] -- )
513 :     postpone ; ( S addr xt )
514 :     over >exec ! ; immediate
515 :    
516 :     : by ( -- addr ) \ Name
517 :     ghost >end @ ;
518 :    
519 :     >TARGET
520 :     \ Variables and Constants 05dec92py
521 :    
522 :     Build: ;
523 :     DO: ( ghost -- addr ) ;DO
524 :     Builder Create
525 :     by Create :dovar resolve
526 :    
527 :     Build: T 0 , H ;
528 :     by Create
529 :     Builder Variable
530 :    
531 :     Build: T 0 A, H ;
532 :     by Create
533 :     Builder AVariable
534 :    
535 : pazsan 1.3 \ User variables 04may94py
536 :    
537 :     >CROSS
538 :     Variable tup 0 tup !
539 :     Variable tudp 0 tudp !
540 :     : u, ( n -- udp )
541 :     tup @ tudp @ + T ! H
542 :     tudp @ dup cell+ tudp ! ;
543 :     : au, ( n -- udp )
544 :     tup @ tudp @ + T A! H
545 :     tudp @ dup cell+ tudp ! ;
546 :     >TARGET
547 :    
548 :     Build: T 0 u, , H ;
549 :     DO: ( ghost -- up-addr ) T @ H tup @ + ;DO
550 : anton 1.1 Builder User
551 : pazsan 1.3 by User :douser resolve
552 : anton 1.1
553 : pazsan 1.3 Build: T 0 u, , 0 u, drop H ;
554 :     by User
555 : anton 1.1 Builder 2User
556 :    
557 : pazsan 1.3 Build: T 0 au, , H ;
558 :     by User
559 : anton 1.1 Builder AUser
560 :    
561 :     Build: ( n -- ) T , H ;
562 :     DO: ( ghost -- n ) T @ H ;DO
563 :     Builder Constant
564 :     by Constant :docon resolve
565 :    
566 :     Build: ( n -- ) T A, H ;
567 :     by Constant
568 :     Builder AConstant
569 :    
570 :     Build: T 0 , H ;
571 :     by Constant
572 :     Builder Value
573 :    
574 :     Build: ( -- ) compile noop ;
575 :     DO: ( ghost -- ) ABORT" CROSS: Don't execute" ;DO
576 :     Builder Defer
577 :    
578 :     \ structural conditionals 17dec92py
579 :    
580 :     >CROSS
581 :     : ?struc ( flag -- ) ABORT" CROSS: unstructured " ;
582 :     : sys? ( sys -- sys ) dup 0= ?struc ;
583 :     : >mark ( -- sys ) T here 0 , H ;
584 :     : >resolve ( sys -- ) T here over - swap ! H ;
585 :     : <resolve ( sys -- ) T here - , H ;
586 :     >TARGET
587 :    
588 :     \ Structural Conditionals 12dec92py
589 :    
590 :     Cond: BUT restrict? sys? swap ;Cond
591 :     Cond: YET restrict? sys? dup ;Cond
592 :    
593 :     >CROSS
594 :     Variable tleavings
595 :     >TARGET
596 :    
597 :     Cond: DONE ( addr -- ) restrict? tleavings @
598 :     BEGIN 2dup u> 0= WHILE dup T @ H swap >resolve REPEAT
599 :     tleavings ! drop ;Cond
600 :    
601 :     >CROSS
602 :     : (leave T here H tleavings @ T , H tleavings ! ;
603 :     >TARGET
604 :    
605 :     Cond: LEAVE restrict? compile branch (leave ;Cond
606 :     Cond: ?LEAVE restrict? compile 0= compile ?branch (leave ;Cond
607 :    
608 :     \ Structural Conditionals 12dec92py
609 :    
610 :     Cond: AHEAD restrict? compile branch >mark ;Cond
611 :     Cond: IF restrict? compile ?branch >mark ;Cond
612 :     Cond: THEN restrict? sys? dup T @ H ?struc >resolve ;Cond
613 :     Cond: ELSE restrict? sys? compile AHEAD swap compile THEN ;Cond
614 :    
615 :     Cond: BEGIN restrict? T here H ;Cond
616 :     Cond: WHILE restrict? sys? compile IF swap ;Cond
617 :     Cond: AGAIN restrict? sys? compile branch <resolve ;Cond
618 :     Cond: UNTIL restrict? sys? compile ?branch <resolve ;Cond
619 :     Cond: REPEAT restrict? over 0= ?struc compile AGAIN compile THEN ;Cond
620 :    
621 :     \ Structural Conditionals 12dec92py
622 :    
623 :     Cond: DO restrict? compile (do) T here H ;Cond
624 :     Cond: ?DO restrict? compile (?do) (leave T here H ;Cond
625 :     Cond: FOR restrict? compile (for) T here H ;Cond
626 :    
627 :     >CROSS
628 :     : loop] dup <resolve cell - compile DONE compile unloop ;
629 :     >TARGET
630 :    
631 :     Cond: LOOP restrict? sys? compile (loop) loop] ;Cond
632 :     Cond: +LOOP restrict? sys? compile (+loop) loop] ;Cond
633 :     Cond: NEXT restrict? sys? compile (next) loop] ;Cond
634 :    
635 :     \ String words 23feb93py
636 :    
637 :     : ," [char] " parse string, T align H ;
638 :    
639 :     Cond: ." restrict? compile (.") T ," H ;Cond
640 :     Cond: S" restrict? compile (S") T ," H ;Cond
641 :     Cond: ABORT" restrict? compile (ABORT") T ," H ;Cond
642 :    
643 :     Cond: IS T ' >body H compile ALiteral compile ! ;Cond
644 :     : IS T ' >body ! H ;
645 : pazsan 1.9 Cond: TO T ' >body H compile ALiteral compile ! ;Cond
646 :     : TO T ' >body ! H ;
647 : anton 1.1
648 :     \ LINKED ERR" ENV" 2ENV" 18may93jaw
649 :    
650 :     \ linked list primitive
651 :     : linked T here over @ A, swap ! H ;
652 :    
653 :     : err" s" ErrLink linked" evaluate T , H
654 :     [char] " parse string, T align H ;
655 :    
656 :     : env" [char] " parse s" EnvLink linked" evaluate
657 :     string, T align , H ;
658 :    
659 :     : 2env" [char] " parse s" EnvLink linked" evaluate
660 :     here >r string, T align , , H
661 :     r> dup T c@ H 80 and swap T c! H ;
662 :    
663 :     \ compile must be last 22feb93py
664 :    
665 :     Cond: compile ( -- ) restrict? \ name
666 :     name gfind dup 0= ABORT" CROSS: Can't compile"
667 :     0> IF gexecute
668 :     ELSE dup >magic @ <imm> =
669 :     IF gexecute
670 :     ELSE compile (compile) gexecute THEN THEN ;Cond
671 :    
672 :     Cond: postpone ( -- ) restrict? \ name
673 :     name gfind dup 0= ABORT" CROSS: Can't compile"
674 :     0> IF gexecute
675 :     ELSE dup >magic @ <imm> =
676 :     IF gexecute
677 :     ELSE compile (compile) gexecute THEN THEN ;Cond
678 :    
679 :     >MINIMAL
680 :     also minimal
681 :     \ Usefull words 13feb93py
682 :    
683 :     : KB 400 * ;
684 :    
685 :     \ define new [IFDEF] and [IFUNDEF] 20may93jaw
686 :    
687 :     : there? name gfind IF >magic @ <fwd> <> ELSE drop false THEN ;
688 :    
689 :     : [IFDEF] there? postpone [IF] ;
690 :     : [IFUNDEF] there? 0= postpone [IF] ;
691 :    
692 :     \ C: \- \+ Conditional Compiling 09jun93jaw
693 :    
694 :     : C: >in @ there? 0=
695 :     IF >in ! T : H
696 :     ELSE drop
697 :     BEGIN bl word dup c@
698 :     IF count comment? s" ;" compare 0= ?EXIT
699 :     ELSE refill 0= ABORT" CROSS: Out of Input while C:"
700 :     THEN
701 :     AGAIN
702 :     THEN ;
703 :    
704 :     also minimal
705 :    
706 :     : \- there? IF postpone \ THEN ;
707 :     : \+ there? 0= IF postpone \ THEN ;
708 :    
709 :     : [IF] postpone [IF] ;
710 :     : [THEN] postpone [THEN] ;
711 :     : [ELSE] postpone [ELSE] ;
712 :    
713 :     Cond: [IF] [IF] ;Cond
714 :     Cond: [IFDEF] [IFDEF] ;Cond
715 :     Cond: [IFUNDEF] [IFUNDEF] ;Cond
716 :     Cond: [THEN] [THEN] ;Cond
717 :     Cond: [ELSE] [ELSE] ;Cond
718 :    
719 :     \ save-cross 17mar93py
720 :    
721 :     \ i'm not interested in bigforth features this time 10may93jaw
722 :     \ [IFDEF] file
723 :     \ also file
724 :     \ [THEN]
725 :     \ included throw after create-file 11may93jaw
726 :    
727 :     endian Constant endian
728 :    
729 :     : save-cross ( "name" -- )
730 :     bl parse ." Saving to " 2dup type
731 :     w/o bin create-file throw >r
732 :     image @ there r@ write-file throw
733 :     bit$ @ there 1- cell>bit rshift 1+ r@ write-file throw
734 :     r> close-file throw ;
735 :    
736 :     \ words that should be in minimal
737 :    
738 :     : + + ; : 1- 1- ;
739 :     : - - ; : 2* 2* ;
740 :     : dup dup ; : over over ;
741 :     : swap swap ; : rot rot ;
742 :    
743 :     \ include bug5.fs
744 :     \ only forth also minimal definitions
745 :    
746 :     : \ postpone \ ;
747 :     : ( postpone ( ;
748 :     : include bl word count included ;
749 :     : .( [char] ) parse type ;
750 :     : cr cr ;
751 :    
752 :     : times 0 ?DO dup T c, H LOOP drop ; \ used for space table creation
753 :     only forth also minimal definitions
754 :    
755 :     \ cross-compiler words
756 :    
757 :     : decimal decimal ;
758 :     : hex hex ;
759 :    
760 : pazsan 1.3 : tudp T tudp H ;
761 :     : tup T tup H ; minimal
762 : anton 1.1
763 :     \ for debugging...
764 :     : order order ;
765 :     : words words ;
766 :     : .s .s ;
767 :    
768 :     : bye bye ;
769 :    
770 :     \ turnkey direction
771 :     : H forth ; immediate
772 :     : T minimal ; immediate
773 :     : G ghosts ; immediate
774 :    
775 :     : turnkey 0 set-order also Target definitions
776 :     also Minimal also ;
777 :    
778 :     \ these ones are pefered:
779 :    
780 :     : lock turnkey ;
781 :     : unlock forth also cross ;
782 :    
783 :     unlock definitions also minimal
784 :     : lock lock ;
785 :     lock

CVS Admin

Powered by ViewCVS 1.0-dev
(Powered by ViewCVS)

ViewCVS and CVS Help