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