--- gforth/cross.fs 1995/08/27 19:56:27 1.27 +++ gforth/cross.fs 1996/09/19 22:17:31 1.39 @@ -1,7 +1,23 @@ \ CROSS.FS The Cross-Compiler 06oct92py -\ $Id: cross.fs,v 1.27 1995/08/27 19:56:27 pazsan Exp $ \ Idea and implementation: Bernd Paysan (py) -\ Copyright 1992-94 by the GNU Forth Development Group + +\ Copyright (C) 1995 Free Software Foundation, Inc. + +\ This file is part of Gforth. + +\ Gforth is free software; you can redistribute it and/or +\ modify it under the terms of the GNU General Public License +\ as published by the Free Software Foundation; either version 2 +\ of the License, or (at your option) any later version. + +\ This program is distributed in the hope that it will be useful, +\ but WITHOUT ANY WARRANTY; without even the implied warranty of +\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +\ GNU General Public License for more details. + +\ You should have received a copy of the GNU General Public License +\ along with this program; if not, write to the Free Software +\ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. \ Log: \ changed in ; [ to state off 12may93jaw @@ -120,7 +136,7 @@ H -4 Constant :dovar -5 Constant :douser -6 Constant :dodefer --7 Constant :dostruc +-7 Constant :dofield -8 Constant :dodoes -9 Constant :doesjump @@ -157,7 +173,7 @@ bigendian \ MakeKernal 12dec92py >MINIMAL -: makekernal ( targetsize -- targetsize ) +: makekernel ( targetsize -- targetsize ) bit$ over 1- cell>bit rshift 1+ initmem image over initmem tdp off ; @@ -178,7 +194,7 @@ CREATE Bittable 80 c, 40 c, 20 c, 10 c, : align+ ( taddr -- rest ) cell tuck 1- and - [ cell 1- ] Literal and ; : cfalign+ ( taddr -- rest ) - \ see kernal.fs:cfaligned + \ see kernel.fs:cfaligned float tuck 1- and - [ float 1- ] Literal and ; >TARGET @@ -186,7 +202,7 @@ CREATE Bittable 80 c, 40 c, 20 c, 10 c, \ assumes cell alignment granularity (as GNU C) : cfaligned ( taddr1 -- taddr2 ) - \ see kernal.fs + \ see kernel.fs dup cfalign+ + ; >CROSS @@ -262,9 +278,8 @@ Variable last-ghost : gfind ( string -- ghost true/1 / string false ) \ searches for string in word-list ghosts -\ !! wouldn't it be simpler to just use search-wordlist ? ae dup count [ ' ghosts >body ] ALiteral search-wordlist - dup IF >r >body nip r> THEN ; + dup IF >r >body nip r> THEN ; VARIABLE Already @@ -341,11 +356,11 @@ variable ResolveFlag VARIABLE ^imm >TARGET -: immediate 20 flag! +: immediate 40 flag! ^imm @ @ dup = IF drop EXIT THEN <> ABORT" CROSS: Cannot immediate a unresolved word" ^imm @ ! ; -: restrict 40 flag! ; +: restrict 20 flag! ; >CROSS \ ALIAS2 ansforth conform alias 9may93jaw @@ -357,7 +372,7 @@ 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 ) ; @@ -370,7 +385,7 @@ s" crossdoc.fd" r/w create-file throw va source >in @ /string doc-file-id write-line throw source >in ! drop ; immediate -Variable to-doc +Variable to-doc to-doc on : cross-doc-entry ( -- ) to-doc @ tlast @ 0<> and \ not an anonymous (i.e. noname) header @@ -385,7 +400,44 @@ Variable to-doc [char] \ parse 2drop POSTPONE \g >in ! - THEN to-doc on ; + THEN ; + +\ Target TAGS creation + +s" kernel.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 + sourcefilename 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 sourceline# 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 @@ -402,7 +454,7 @@ VARIABLE CreateFlag CreateFlag off Already @ IF dup >end tdoes ! ELSE 0 tdoes ! THEN 80 flag! - cross-doc-entry ; + cross-doc-entry cross-tag-entry ; VARIABLE ;Resolve 1 cells allot @@ -411,7 +463,6 @@ 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 @@ -446,7 +497,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 ' @@ -516,6 +567,9 @@ Cond: [Char] ( "" -- ) restrict (THeader ;Resolve ! there ;Resolve cell+ ! docol, depth T ] H ; +: :noname ( -- colon-sys ) + T align H there docol, depth T ] H ; + Cond: EXIT ( -- ) restrict? compile ;S ;Cond Cond: ?EXIT ( -- ) 1 abort" CROSS: using ?exit" ;Cond @@ -534,7 +588,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 ; @@ -641,11 +695,19 @@ Build: T 0 , H ; by Constant Builder Value +Build: T 0 A, H ; +by Constant +Builder AValue + Build: ( -- ) compile noop ; DO: ( ghost -- ) ABORT" CROSS: Don't execute" ;DO Builder Defer by Defer :dodefer resolve +Build: ( inter comp -- ) swap T immediate A, A, H ; +DO: ( ghost -- ) ABORT" CROSS: Don't execute" ;DO +Builder interpret/compile: + \ Sturctures 23feb95py >CROSS @@ -658,7 +720,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 ; @@ -820,13 +882,22 @@ Cond: [ELSE] [ELSE] ;Cond bigendian Constant bigendian -Create magic s" gforth00" here over allot swap move +Create magic s" Gforth10" here over allot swap move -[char] 1 bigendian + cell + magic 7 + c! +char 1 bigendian + cell + magic 7 + c! -: save-cross ( "name" -- ) - bl parse ." Saving to " 2dup type +: save-cross ( "image-name" "binary-name" -- ) + bl parse ." Saving to " 2dup type cr w/o bin create-file throw >r + s" #! " r@ write-file throw + bl parse r@ write-file throw + s" -i" r@ write-file throw + #lf r@ emit-file throw + r@ dup file-position throw drop 8 mod 8 swap ( file-id limit index ) + ?do + bl over emit-file throw + loop + drop magic 8 r@ write-file throw \ write magic image @ there r@ write-file throw \ write image bit$ @ there 1- cell>bit rshift 1+ @@ -864,7 +935,12 @@ only forth also minimal definitions : hex hex ; : tudp T tudp H ; -: tup T tup H ; minimal +: tup T tup H ; + +: doc-off false T to-doc H ! ; +: doc-on true T to-doc H ! ; + +minimal \ for debugging... : order order ;