--- gforth/cross.fs 1995/02/23 20:17:16 1.24 +++ gforth/cross.fs 1995/10/07 17:38:11 1.29 @@ -1,5 +1,5 @@ \ CROSS.FS The Cross-Compiler 06oct92py -\ $Id: cross.fs,v 1.24 1995/02/23 20:17:16 pazsan Exp $ +\ $Id: cross.fs,v 1.29 1995/10/07 17:38:11 anton Exp $ \ Idea and implementation: Bernd Paysan (py) \ Copyright 1992-94 by the GNU Forth Development Group @@ -120,7 +120,7 @@ H -4 Constant :dovar -5 Constant :douser -6 Constant :dodefer --7 Constant :dostruc +-7 Constant :dofield -8 Constant :dodoes -9 Constant :doesjump @@ -357,10 +357,73 @@ VARIABLE ^imm \ Target Header Creation 01nov92py : string, ( addr count -- ) - dup T c, H bounds DO I c@ T c, H LOOP ; + dup T c, H bounds ?DO I c@ T c, H LOOP ; : name, ( "name" -- ) bl word count string, T cfalign H ; : view, ( -- ) ( dummy ) ; +\ Target Document Creation (goes to crossdoc.fd) 05jul95py + +s" crossdoc.fd" r/w create-file throw value doc-file-id +\ contains the file-id of the documentation file + +: \G ( -- ) + source >in @ /string doc-file-id write-line throw + source >in ! drop ; immediate + +Variable to-doc + +: cross-doc-entry ( -- ) + to-doc @ tlast @ 0<> and \ not an anonymous (i.e. noname) header + IF + s" " doc-file-id write-line throw + s" make-doc " doc-file-id write-file throw + tlast @ >image count $1F and doc-file-id write-file throw + >in @ + [char] ( parse 2drop + [char] ) parse doc-file-id write-file throw + s" )" doc-file-id write-file throw + [char] \ parse 2drop + POSTPONE \g + >in ! + THEN to-doc on ; + +\ Target TAGS creation + +s" TAGS" r/w create-file throw value tag-file-id +\ contains the file-id of the tags file + +Create tag-beg 2 c, 7F c, bl c, +Create tag-end 2 c, bl c, 01 c, +Create tag-bof 1 c, 0C c, + +2variable last-loadfilename 0 0 last-loadfilename 2! + +: put-load-file-name ( -- ) + loadfilename 2@ last-loadfilename 2@ d<> + IF + tag-bof count tag-file-id write-line throw + loadfilename 2@ 2dup + tag-file-id write-file throw + last-loadfilename 2! + s" ,0" tag-file-id write-line throw + THEN ; + +: cross-tag-entry ( -- ) + tlast @ 0<> \ not an anonymous (i.e. noname) header + IF + put-load-file-name + source >in @ min tag-file-id write-file throw + tag-beg count tag-file-id write-file throw + tlast @ >image count $1F and tag-file-id write-file throw + tag-end count tag-file-id write-file throw + base @ decimal loadline @ 0 <# #s #> tag-file-id write-file throw +\ >in @ 0 <# #s [char] , hold #> tag-file-id write-line throw + s" ,0" tag-file-id write-line throw + base ! + THEN ; + +\ Target header creation + VARIABLE CreateFlag CreateFlag off : (Theader ( "name" -- ghost ) T align H view, @@ -375,7 +438,8 @@ VARIABLE CreateFlag CreateFlag off dup >magic ^imm ! \ a pointer for immediate Already @ IF dup >end tdoes ! ELSE 0 tdoes ! THEN - 80 flag! ; + 80 flag! + cross-doc-entry cross-tag-entry ; VARIABLE ;Resolve 1 cells allot @@ -384,6 +448,7 @@ VARIABLE ;Resolve 1 cells allot >TARGET : Alias ( cfa -- ) \ name + dup 0< IF to-doc off THEN (THeader over resolve T A, H 80 flag! ; >CROSS @@ -418,7 +483,7 @@ ghost (loop) ghost (+loop) ghost (next) drop ghost unloop ghost ;S 2drop ghost lit ghost (compile) ghost ! 2drop drop -ghost (;code) ghost noop 2drop +ghost (does>) ghost noop 2drop ghost (.") ghost (S") ghost (ABORT") 2drop drop ghost ' @@ -506,7 +571,7 @@ Cond: [ restrict? state off ;Cond >TARGET Cond: DOES> restrict? - compile (;code) dodoes, tdoes @ ?dup IF @ T here H resolve THEN + compile (does>) dodoes, tdoes @ ?dup IF @ T here H resolve THEN ;Cond : DOES> dodoes, T here H !does depth T ] H ; @@ -630,7 +695,7 @@ Build: >r rot r@ nalign dup T , H ( a + swap r> nalign ; DO: T @ H + ;DO Builder Field -by Field :dostruc resolve +by Field :dofield resolve : struct T 0 1 chars H ; : end-struct T 2Constant H ; @@ -792,10 +857,14 @@ Cond: [ELSE] [ELSE] ;Cond bigendian Constant bigendian +Create magic s" gforth00" here over allot swap move + +[char] 1 bigendian + cell + magic 7 + c! + : save-cross ( "name" -- ) bl parse ." Saving to " 2dup type w/o bin create-file throw >r - s" gforth00" r@ write-file throw \ write magic + magic 8 r@ write-file throw \ write magic image @ there r@ write-file throw \ write image bit$ @ there 1- cell>bit rshift 1+ r@ write-file throw \ write tags @@ -816,8 +885,9 @@ cell constant cell \ include bug5.fs \ only forth also minimal definitions -: \ postpone \ ; -: ( postpone ( ; +: \ postpone \ ; +: \G postpone \G ; +: ( postpone ( ; : include bl word count included ; : .( [char] ) parse type ; : cr cr ;