--- gforth/cross.fs 1994/07/08 15:00:30 1.7 +++ gforth/cross.fs 1994/12/15 12:35:12 1.18 @@ -1,7 +1,7 @@ \ CROSS.FS The Cross-Compiler 06oct92py -\ $Id: cross.fs,v 1.7 1994/07/08 15:00:30 anton Exp $ +\ $Id: cross.fs,v 1.18 1994/12/15 12:35:12 pazsan Exp $ \ Idea and implementation: Bernd Paysan (py) -\ Copyright 1992 by the ANSI figForth Development Group +\ Copyright 1992-94 by the GNU Forth Development Group \ Log: \ changed in ; [ to state off 12may93jaw @@ -21,7 +21,7 @@ \ targets 09jun93jaw \ added: 2user and value 11jun93jaw -include other.fs \ ansforth extentions for cross +\ include other.fs \ ansforth extentions for cross : comment? ( c-addr u -- c-addr u ) 2dup s" (" compare 0= @@ -31,47 +31,6 @@ include other.fs \ ansforth extent decimal -\ number? 11may93jaw - -\ checks for +, -, $, & ... -: leading? ( c-addr u -- c-addr u doubleflag negflag base ) - 2dup 1- chars + c@ [char] . = \ process double - IF dup 1 chars = IF over 1 swap c! false ELSE 1 chars - true THEN - \ only if more than only . ( may be number output! ) - \ if only . => store garbage - ELSE false THEN >r \ numbers - false -rot base @ -rot - BEGIN over c@ - dup [char] - = - IF drop >r >r >r - drop true r> r> r> 0 THEN - dup [char] + = - IF drop 0 THEN - dup [char] $ = - IF drop >r >r drop 16 r> r> 0 THEN - dup [char] & = - IF drop >r >r drop 10 r> r> 0 THEN - 0= IF 1 chars - swap char+ swap false ELSE true THEN - over 0= or - UNTIL - rot >r rot r> r> -rot ; - -: number? ( c-addr -- n/d flag ) -\ return -1 if cell 1 if double 0 if garbage - 0 swap 0 swap \ create double number - count leading? - base @ >r base ! - >r >r - >number IF 2drop false r> r> 2drop - r> base ! EXIT THEN - drop r> r> - IF IF dnegate 1 - ELSE drop negate -1 THEN - ELSE IF 1 ELSE drop -1 THEN - THEN r> base ! ; - - - \ Begin CROSS COMPILER: \ GhostNames 9may93jaw @@ -81,7 +40,7 @@ VARIABLE GhostNames 0 GhostNames ! : GhostName ( -- addr ) here GhostNames @ , GhostNames ! here 0 , - name count + bl word count \ 2dup type space dup c, here over chars allot swap move align ; @@ -125,7 +84,7 @@ Variable tdp \ Parameter for target systems 06oct92py -include machine.fs +included >TARGET @@ -145,12 +104,13 @@ include machine.fs -3 Constant :docon -4 Constant :dovar -5 Constant :douser --6 Constant :dodoes --7 Constant :doesjump +-6 Constant :dodefer +-7 Constant :dodoes +-8 Constant :doesjump >CROSS -endian 0 pad ! -1 pad c! pad @ 0< +bigendian 0 pad ! -1 pad c! pad @ 0< = [IF] : bswap ; immediate [ELSE] : bswap ( big / little -- little / big ) 0 cell 1- FOR bits/byte lshift over @@ -260,11 +220,12 @@ Variable atonce atonce off : >magic ; : >link cell+ ; : >exec cell+ cell+ ; : >end 3 cells + ; +Variable last-ghost : Make-Ghost ( "name" -- ghost ) >in @ GhostName swap >in ! - DOES> >exec @ execute ; + DOES> dup last-ghost ! >exec @ execute ; \ ghost words 14oct92py \ changed: 10may93py/jaw @@ -273,15 +234,13 @@ Variable atonce atonce off \ 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 -\ >r get-order 0 set-order also ghosts r> find >r >r - >r r@ IF >body nip THEN r> ; -\ set-order r> r@ IF >body THEN r> ; + dup IF >r >body nip r> THEN ; VARIABLE Already : ghost ( "name" -- ghost ) Already off - >in @ name gfind IF Already on nip EXIT THEN + >in @ bl word gfind IF Already on nip EXIT THEN drop >in ! Make-Ghost ; \ resolve 14oct92py @@ -297,7 +256,7 @@ VARIABLE Already BEGIN @ dup WHILE 2dup cell+ @ = UNTIL - nip 2 cells + count cr ." CROSS: Exists: " type 4 spaces + 2 cells + count cr ." CROSS: Exists: " type 4 spaces drop swap cell+ ! ELSE true ABORT" CROSS: Ghostnames inconsistent" THEN ; @@ -336,7 +295,13 @@ variable ResolveFlag Ghostnames BEGIN @ dup WHILE dup ?resolved - REPEAT drop ResolveFlag @ 0= IF ." Nothing!" THEN cr ; + REPEAT drop ResolveFlag @ + IF + abort" Unresolved words!" + ELSE + ." Nothing!" + THEN + cr ; >CROSS \ Header states 12dec92py @@ -347,23 +312,23 @@ VARIABLE ^imm >TARGET : immediate 20 flag! - ^imm @ @ dup = ?EXIT + ^imm @ @ dup = IF drop EXIT THEN <> ABORT" CROSS: Cannot immediate a unresolved word" ^imm @ ! ; -: restrict ; +: restrict 40 flag! ; >CROSS \ ALIAS2 ansforth conform alias 9may93jaw : ALIAS2 create here 0 , DOES> @ execute ; \ usage: -\ ' alias2 bla ! +\ ' alias2 bla ! \ Target Header Creation 01nov92py : string, ( addr count -- ) dup T c, H bounds DO I c@ T c, H LOOP ; -: name, ( "name" -- ) name count string, T align H ; +: name, ( "name" -- ) bl word count string, T align H ; : view, ( -- ) ( dummy ) ; VARIABLE CreateFlag CreateFlag off @@ -372,10 +337,10 @@ VARIABLE CreateFlag CreateFlag off tlast @ dup 0> IF T 1 cells - THEN A, H there tlast ! >in @ name, >in ! T here H tlastcfa ! CreateFlag @ IF - >in @ alias2 swap >in ! \ create alias in target - >in @ ghost swap >in ! - swap also ghosts ' previous swap ! \ tick ghost and store in alias - CreateFlag off + >in @ alias2 swap >in ! \ create alias in target + >in @ ghost swap >in ! + swap also ghosts ' previous swap ! \ tick ghost and store in alias + CreateFlag off ELSE ghost THEN dup >magic ^imm ! \ a pointer for immediate Already @ IF dup >end tdoes ! @@ -384,7 +349,8 @@ VARIABLE CreateFlag CreateFlag off VARIABLE ;Resolve 1 cells allot -: Theader ( "name" -- ) (THeader there resolve 0 ;Resolve ! ; +: Theader ( "name" -- ghost ) + (THeader dup there resolve 0 ;Resolve ! ; >TARGET : Alias ( cfa -- ) \ name @@ -424,23 +390,26 @@ ghost unloop ghost ;S ghost lit ghost (compile) ghost ! 2drop drop ghost (;code) ghost noop 2drop ghost (.") ghost (S") ghost (ABORT") 2drop drop +ghost ' \ compile 10may93jaw : compile ( -- ) \ name restrict? - name gfind dup 0= ABORT" CROSS: Can't compile " + bl word gfind dup 0= ABORT" CROSS: Can't compile " 0> ( immediate? ) IF >exec @ compile, ELSE postpone literal postpone gexecute THEN ; immediate >TARGET -: ' ( -- cfa ) name gfind 0= ABORT" CROSS: undefined " +: ' ( -- cfa ) bl word gfind 0= ABORT" CROSS: undefined " dup >magic @ = ABORT" CROSS: forward " >link @ ; Cond: ['] compile lit ghost gexecute ;Cond +Cond: chars ;Cond + >CROSS \ tLiteral 12dec92py @@ -473,7 +442,7 @@ Cond: [Char] ( "" -- ) restrict : ] state on BEGIN - BEGIN >in @ name + BEGIN >in @ bl word dup c@ 0= WHILE 2drop refill 0= ABORT" CROSS: End of file while target compiling" REPEAT @@ -520,34 +489,33 @@ Cond: DOES> restrict? >in @ alias2 swap dup >in ! >r >r Make-Ghost rot swap >exec ! , r> r> >in ! - also ghosts ' previous swap ! - DOES> dup >exec @ execute ; + also ghosts ' previous swap ! ; +\ DOES> dup >exec @ execute ; : gdoes, ( ghost -- ) >end @ dup >magic @ <> IF dup >link @ dup 0< IF T A, 0 , H drop EXIT THEN drop THEN :dodoes T A, H gexecute T here H cell - reloff ; -: TCreate ( ghost -- ) +: TCreate ( -- ) + last-ghost @ CreateFlag on - Theader dup gdoes, - >end @ >exec @ execute ; + Theader >r dup gdoes, + >end @ >exec @ r> >exec ! ; : Build: ( -- [xt] [colon-sys] ) :noname postpone TCreate ; : gdoes> ( ghost -- addr flag ) + last-ghost @ state @ IF gexecute true EXIT THEN cell+ @ T >body H false ; \ DO: ;DO 11may93jaw \ changed to ?EXIT 10may93jaw -: (does>) postpone does> ; immediate \ second level does> - : DO: ( -- addr [xt] [colon-sys] ) here ghostheader - :noname - postpone (does>) postpone gdoes> postpone ?EXIT ; + :noname postpone gdoes> postpone ?EXIT ; : ;DO ( addr [xt] [colon-sys] -- ) postpone ; ( S addr xt ) @@ -614,6 +582,7 @@ Builder Value Build: ( -- ) compile noop ; DO: ( ghost -- ) ABORT" CROSS: Don't execute" ;DO Builder Defer +by Defer :dodefer resolve \ structural conditionals 17dec92py @@ -682,6 +651,8 @@ Cond: ABORT" restrict? compile (ABORT Cond: IS T ' >body H compile ALiteral compile ! ;Cond : IS T ' >body ! H ; +Cond: TO T ' >body H compile ALiteral compile ! ;Cond +: TO T ' >body ! H ; \ LINKED ERR" ENV" 2ENV" 18may93jaw @@ -701,14 +672,14 @@ Cond: IS T ' >body H compile ALit \ compile must be last 22feb93py Cond: compile ( -- ) restrict? \ name - name gfind dup 0= ABORT" CROSS: Can't compile" + bl word gfind dup 0= ABORT" CROSS: Can't compile" 0> IF gexecute ELSE dup >magic @ = IF gexecute ELSE compile (compile) gexecute THEN THEN ;Cond Cond: postpone ( -- ) restrict? \ name - name gfind dup 0= ABORT" CROSS: Can't compile" + bl word gfind dup 0= ABORT" CROSS: Can't compile" 0> IF gexecute ELSE dup >magic @ = IF gexecute @@ -722,7 +693,7 @@ also minimal \ define new [IFDEF] and [IFUNDEF] 20may93jaw -: there? name gfind IF >magic @ <> ELSE drop false THEN ; +: there? bl word gfind IF >magic @ <> ELSE drop false THEN ; : [IFDEF] there? postpone [IF] ; : [IFUNDEF] there? 0= postpone [IF] ; @@ -762,21 +733,27 @@ Cond: [ELSE] [ELSE] ;Cond \ [THEN] \ included throw after create-file 11may93jaw -endian Constant endian +bigendian Constant bigendian : save-cross ( "name" -- ) bl parse ." Saving to " 2dup type w/o bin create-file throw >r - image @ there r@ write-file throw - bit$ @ there 1- cell>bit rshift 1+ r@ write-file throw + s" gforth00" 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 r> close-file throw ; \ words that should be in minimal : + + ; : 1- 1- ; : - - ; : 2* 2* ; +: * * ; : / / ; : dup dup ; : over over ; : swap swap ; : rot rot ; +: drop drop ; +: lshift lshift ; : 2/ 2/ ; +cell constant cell \ include bug5.fs \ only forth also minimal definitions