--- gforth/cross.fs 1994/05/03 15:24:11 1.2 +++ gforth/cross.fs 1994/09/02 15:23:33 1.11 @@ -1,5 +1,5 @@ \ CROSS.FS The Cross-Compiler 06oct92py -\ $Id: cross.fs,v 1.2 1994/05/03 15:24:11 pazsan Exp $ +\ $Id: cross.fs,v 1.11 1994/09/02 15:23:33 pazsan Exp $ \ Idea and implementation: Bernd Paysan (py) \ Copyright 1992 by the ANSI figForth Development Group @@ -21,50 +21,15 @@ \ targets 09jun93jaw \ added: 2user and value 11jun93jaw -include other.fs \ ansforth extentions for cross - -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 ! ; +\ include other.fs \ ansforth extentions for cross +: comment? ( c-addr u -- c-addr u ) + 2dup s" (" compare 0= + IF postpone ( + ELSE 2dup s" \" compare 0= IF postpone \ THEN + THEN ; +decimal \ Begin CROSS COMPILER: @@ -117,16 +82,9 @@ Variable bit$ Variable tdp : there tdp @ ; -\ Constants 06apr93py - --2 Constant :docol --3 Constant :docon --4 Constant :dovar --5 Constant :dodoes - \ Parameter for target systems 06oct92py -include machine.fs +include-file >TARGET @@ -135,7 +93,8 @@ include machine.fs : cell+ cell + ; : cells cell<< lshift ; : chars ; - +: floats float * ; + >CROSS : cell/ cell<< rshift ; >TARGET @@ -144,7 +103,10 @@ include machine.fs -2 Constant :docol -3 Constant :docon -4 Constant :dovar --5 Constant :dodoes +-5 Constant :douser +-6 Constant :dodefer +-7 Constant :dodoes +-8 Constant :doesjump >CROSS @@ -160,10 +122,10 @@ endian 0 pad ! -1 pad c! pad @ 0< \ Fixed bug in else part 11may93jaw [IFDEF] Memory \ Memory is a bigFORTH feature - Memory + also Memory : initmem ( var len -- ) 2dup swap handle! >r @ r> erase ; - Target + toss [ELSE] : initmem ( var len -- ) tuck allocate abort" CROSS: No memory for target" @@ -186,7 +148,9 @@ CREATE Bittable 80 c, 40 c, 20 c, 10 c, : >bit ( addr n -- c-addr mask ) 8 /mod rot + swap bits ; : +bit ( addr n -- ) >bit over c@ or swap c! ; +: -bit ( addr n -- ) >bit invert over c@ and swap c! ; : relon ( taddr -- ) bit$ @ swap cell/ +bit ; +: reloff ( taddr -- ) bit$ @ swap cell/ -bit ; \ Target memory access 06oct92py @@ -204,6 +168,8 @@ CREATE Bittable 80 c, 40 c, 20 c, 10 c, : ! ( w taddr -- ) >r bswap r> >image ! ; : c@ ( taddr -- char ) >image c@ ; : c! ( char taddr -- ) >image c! ; +: 2@ ( taddr -- x1 x2 ) T dup cell+ @ swap @ H ; +: 2! ( x1 x2 taddr -- ) T swap over ! cell+ ! H ; \ Target compilation primitives 06oct92py \ included A! 16may93jaw @@ -228,7 +194,7 @@ CREATE Bittable 80 c, 40 c, 20 c, 10 c, : >body ( cfa -- pfa ) T cell+ cell+ H ; >CROSS -: dodoes, ( -- ) T 0 , 0 , H ; +: dodoes, ( -- ) T :doesjump A, 0 , H ; \ Ghost Builder 06oct92py @@ -254,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 @@ -266,8 +233,10 @@ Variable atonce atonce off : 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 - >r get-order 0 set-order also ghosts r> find >r >r - set-order r> r@ IF >body THEN r> ; + 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> ; VARIABLE Already @@ -328,7 +297,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 @@ -342,7 +317,7 @@ VARIABLE ^imm ^imm @ @ dup = ?EXIT <> ABORT" CROSS: Cannot immediate a unresolved word" ^imm @ ! ; -: restrict ; +: restrict 40 flag! ; >CROSS \ ALIAS2 ansforth conform alias 9may93jaw @@ -376,7 +351,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 @@ -416,6 +392,7 @@ 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 @@ -483,6 +460,8 @@ Cond: [Char] ( "" -- ) restrict Cond: EXIT ( -- ) restrict? compile ;S ;Cond +Cond: ?EXIT ( -- ) 1 abort" CROSS: using ?exit" ;Cond + Cond: ; ( -- ) restrict? depth ?dup IF 1- <> ABORT" CROSS: Stack changed" ELSE true ABORT" CROSS: Stack empty" THEN @@ -510,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 ; + :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 ) @@ -562,16 +540,30 @@ Build: T 0 A, H ; by Create Builder AVariable -Build: T 0 , H ; -by Create +\ User variables 04may94py + +>CROSS +Variable tup 0 tup ! +Variable tudp 0 tudp ! +: u, ( n -- udp ) + tup @ tudp @ + T ! H + tudp @ dup cell+ tudp ! ; +: au, ( n -- udp ) + tup @ tudp @ + T A! H + tudp @ dup cell+ tudp ! ; +>TARGET + +Build: T 0 u, , H ; +DO: ( ghost -- up-addr ) T @ H tup @ + ;DO Builder User +by User :douser resolve -Build: T 0 , 0 , H ; -by Create +Build: T 0 u, , 0 u, drop H ; +by User Builder 2User -Build: T 0 A, H ; -by Create +Build: T 0 au, , H ; +by User Builder AUser Build: ( n -- ) T , H ; @@ -590,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 @@ -658,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 @@ -751,6 +746,7 @@ endian Constant endian : + + ; : 1- 1- ; : - - ; : 2* 2* ; +: * * ; : / / ; : dup dup ; : over over ; : swap swap ; : rot rot ; @@ -771,6 +767,8 @@ only forth also minimal definitions : decimal decimal ; : hex hex ; +: tudp T tudp H ; +: tup T tup H ; minimal \ for debugging... : order order ;