--- gforth/cross.fs 1994/07/13 19:20:59 1.8 +++ gforth/cross.fs 1997/02/12 00:25:34 1.45 @@ -1,7 +1,23 @@ \ CROSS.FS The Cross-Compiler 06oct92py -\ $Id: cross.fs,v 1.8 1994/07/13 19:20:59 pazsan Exp $ \ Idea and implementation: Bernd Paysan (py) -\ Copyright 1992 by the ANSI figForth 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 @@ -21,8 +37,12 @@ \ targets 09jun93jaw \ added: 2user and value 11jun93jaw -include other.fs \ ansforth extentions for cross +\ include other.fs \ ansforth extentions for cross +: string, ( c-addr u -- ) + \ puts down string as cstring + dup c, here swap chars dup allot move ; +' falign Alias cfalign : comment? ( c-addr u -- c-addr u ) 2dup s" (" compare 0= IF postpone ( @@ -31,47 +51,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 @@ -80,10 +59,10 @@ decimal VARIABLE GhostNames 0 GhostNames ! : GhostName ( -- addr ) - here GhostNames @ , GhostNames ! here 0 , - name count -\ 2dup type space - dup c, here over chars allot swap move align ; + here GhostNames @ , GhostNames ! here 0 , + bl word count + \ 2dup type space + string, cfalign ; hex @@ -112,9 +91,20 @@ H >CROSS +\ Parameter for target systems 06oct92py + +mach-file count included + +also Forth definitions + +[IFDEF] asm-include asm-include [THEN] + +previous + +>CROSS + \ Variables 06oct92py --1 Constant NIL Variable image Variable tlast NIL tlast ! \ Last name field Variable tlastcfa \ Last code field @@ -123,39 +113,45 @@ Variable bit$ Variable tdp : there tdp @ ; -\ Parameter for target systems 06oct92py +\ Create additional parameters 19jan95py -include machine.fs +T +cell Constant tcell +cell<< Constant tcell<< +cell>bit Constant tcell>bit +bits/byte Constant tbits/byte +float Constant tfloat +1 bits/byte lshift Constant maxbyte +H >TARGET \ Byte ordering and cell size 06oct92py -: cell+ cell + ; -: cells cell<< lshift ; +: cell+ tcell + ; +: cells tcell<< lshift ; : chars ; -: floats float * ; +: floats tfloat * ; >CROSS -: cell/ cell<< rshift ; +: cell/ tcell<< rshift ; >TARGET 20 CONSTANT bl -1 Constant NIL --2 Constant :docol --3 Constant :docon --4 Constant :dovar --5 Constant :douser --6 Constant :dodoes --7 Constant :doesjump >CROSS -endian 0 pad ! -1 pad c! pad @ 0< -= [IF] : bswap ; immediate -[ELSE] : bswap ( big / little -- little / big ) 0 - cell 1- FOR bits/byte lshift over - [ 1 bits/byte lshift 1- ] Literal and or - swap bits/byte rshift swap NEXT nip ; +bigendian +[IF] + : T! ( n addr -- ) >r s>d r> tcell bounds swap 1- + DO maxbyte ud/mod rot I c! -1 +LOOP 2drop ; + : T@ ( addr -- n ) >r 0 0 r> tcell bounds + DO maxbyte * swap maxbyte um* rot + swap I c@ + swap LOOP d>s ; +[ELSE] + : T! ( n addr -- ) >r s>d r> tcell bounds + DO maxbyte ud/mod rot I c! LOOP 2drop ; + : T@ ( addr -- n ) >r 0 0 r> tcell bounds swap 1- + DO maxbyte * swap maxbyte um* rot + swap I c@ + swap -1 +LOOP d>s ; [THEN] \ Memory initialisation 05dec92py @@ -176,7 +172,7 @@ endian 0 pad ! -1 pad c! pad @ 0< \ MakeKernal 12dec92py >MINIMAL -: makekernal ( targetsize -- targetsize ) +: makekernel ( targetsize -- targetsize ) bit$ over 1- cell>bit rshift 1+ initmem image over initmem tdp off ; @@ -196,16 +192,23 @@ 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 kernel.fs:cfaligned + /maxalign tuck 1- and - [ /maxalign 1- ] Literal and ; >TARGET : aligned ( taddr -- ta-addr ) dup align+ + ; \ assumes cell alignment granularity (as GNU C) +: cfaligned ( taddr1 -- taddr2 ) + \ see kernel.fs + dup cfalign+ + ; + >CROSS : >image ( taddr -- absaddr ) image @ + ; >TARGET -: @ ( taddr -- w ) >image @ bswap ; -: ! ( w taddr -- ) >r bswap r> >image ! ; +: @ ( taddr -- w ) >image t@ ; +: ! ( w taddr -- ) >image t! ; : c@ ( taddr -- char ) >image c@ ; : c! ( char taddr -- ) >image c! ; : 2@ ( taddr -- x1 x2 ) T dup cell+ @ swap @ H ; @@ -219,6 +222,8 @@ CREATE Bittable 80 c, 40 c, 20 c, 10 c, : , ( w -- ) T here H cell T allot ! H ; : c, ( char -- ) T here 1 allot c! H ; : align ( -- ) T here H align+ 0 ?DO bl T c, H LOOP ; +: cfalign ( -- ) + T here H cfalign+ 0 ?DO bl T c, H LOOP ; : A! dup relon T ! H ; : A, ( w -- ) T here H relon T , H ; @@ -227,15 +232,10 @@ CREATE Bittable 80 c, 40 c, 20 c, 10 c, \ threading modell 13dec92py -\ generic threading modell -: docol, ( -- ) :docol T A, 0 , H ; - >TARGET : >body ( cfa -- pfa ) T cell+ cell+ H ; >CROSS -: dodoes, ( -- ) T :doesjump A, 0 , H ; - \ Ghost Builder 06oct92py \ new version with temp variable 10may93jaw @@ -246,7 +246,7 @@ VARIABLE VocTemp : T> previous VocTemp @ set-current ; 4711 Constant 4712 Constant -4713 Constant +4713 Constant 4714 Constant \ iForth makes only immediate directly after create \ make atonce trick! ? @@ -257,31 +257,31 @@ Variable atonce atonce off : GhostHeader , 0 , ['] NoExec , ; -: >magic ; : >link cell+ ; : >exec cell+ cell+ ; +: >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 : 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 -\ >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,9 +297,9 @@ 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" + ELSE true abort" CROSS: Ghostnames inconsistent " THEN ; : resolve ( ghost tcfa -- ) @@ -336,7 +336,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 @@ -346,49 +352,145 @@ variable ResolveFlag VARIABLE ^imm >TARGET -: immediate 20 flag! - ^imm @ @ dup = ?EXIT +: 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 : 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 ; + 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 + +: T-\G ( -- ) + source >in @ /string doc-file-id write-line throw + postpone \ ; + +Variable to-doc to-doc on + +: 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 + T-\G + >in ! + 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 ; + +\ Check for words + +Defer skip? ' false IS skip? + +: defined? ( -- flag ) \ name + ghost >magic @ <> ; + +: needed? ( -- flag ) \ name + ghost dup >magic @ = + IF >link @ 0<> ELSE drop false THEN ; + +: doer? ( -- flag ) \ name + ghost >magic @ = ; + +: skip-defs ( -- ) + BEGIN refill WHILE source -trailing nip 0= UNTIL THEN ; + +\ Target header creation + VARIABLE CreateFlag CreateFlag off -: (Theader ( "name" -- ghost ) T align H view, +: (Theader ( "name" -- ghost ) +\ >in @ bl word count type 2 spaces >in ! + T align H view, 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 ! ELSE 0 tdoes ! THEN - 80 flag! ; + 80 flag! + cross-doc-entry cross-tag-entry ; 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 - (THeader over resolve T A, H 80 flag! ; + >in @ skip? IF 2drop EXIT THEN >in ! + dup 0< has-prims 0= and + IF + ." needs prim: " >in @ bl word count type >in ! cr + THEN + (THeader over resolve T A, H 80 flag! ; +: Alias: ( cfa -- ) \ name + >in @ skip? IF 2drop EXIT THEN >in ! + dup 0< has-prims 0= and + IF + ." needs doer: " >in @ bl word count type >in ! cr + THEN + ghost tuck swap resolve swap >magic ! ; >CROSS \ Conditionals and Comments 11may93jaw @@ -422,25 +524,54 @@ 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 ' drop +ghost :docol ghost :doesjump ghost :dodoes 2drop drop +ghost over ghost = ghost drop 2drop drop \ 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 +\ generic threading modell +: docol, ( -- ) compile :docol T 0 , H ; + +: dodoes, ( -- ) compile :doesjump T 0 , H ; + +[IFUNDEF] (code) +Defer (code) +Defer (end-code) +[THEN] + >TARGET -: ' ( -- cfa ) name gfind 0= ABORT" CROSS: undefined " +: Code + (THeader there resolve + there 2 T cells H + T a, 0 , H + depth (code) ; + +: Code: + ghost dup there resolve swap >magic ! + depth (code) ; + +: end-code + depth ?dup IF 1- <> ABORT" CROSS: Stack changed" + ELSE true ABORT" CROSS: Stack empty" THEN + (end-code) ; + +: ' ( -- 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 @@ -448,12 +579,38 @@ Cond: ['] compile lit ghost gexecute ;C : alit, ( n -- ) compile lit T A, H ; >TARGET +Cond: \G T-\G ;Cond + Cond: Literal ( n -- ) restrict? lit, ;Cond Cond: ALiteral ( n -- ) restrict? alit, ;Cond : Char ( "" -- ) bl word char+ c@ ; Cond: [Char] ( "" -- ) restrict? Char lit, ;Cond +\ some special literals 27jan97jaw + +Cond: MAXU + restrict? compile lit + tcell 0 ?DO FF T c, H LOOP ;Cond + +Cond: MINI + restrict? compile lit + bigendian IF + 80 T c, H tcell 1 ?DO 0 T c, H LOOP + ELSE + tcell 1 ?DO 0 T c, H LOOP 80 T c, H + THEN + ;Cond + +Cond: MAXI + restrict? compile lit + bigendian IF + 7F T c, H tcell 1 ?DO FF T c, H LOOP + ELSE + tcell 1 ?DO FF T c, H LOOP 7F T c, H + THEN + ;Cond + >CROSS \ Target compiling loop 12dec92py \ ">tib trick thrown out 10may93jaw @@ -473,7 +630,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 @@ -486,9 +643,13 @@ Cond: [Char] ( "" -- ) restrict \ is not allowed if a system should be ans conform : : ( -- colon-sys ) \ Name + >in @ skip? IF drop skip-defs EXIT THEN >in ! (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 @@ -503,11 +664,12 @@ Cond: ; ( -- ) restrict? Cond: [ restrict? state off ;Cond >CROSS -: !does :dodoes tlastcfa @ tuck T ! cell+ ! H ; +: !does + tlastcfa @ dup there >r tdp ! compile :dodoes r> tdp ! T cell+ ! H ; >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 ; @@ -520,34 +682,40 @@ 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 ; + IF + dup >magic @ = + IF gexecute T 0 , H EXIT THEN + THEN + compile :dodoes 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 ; + +: by: ( -- addr [xt] [colon-sys] ) \ name + ghost + :noname postpone gdoes> postpone ?EXIT ; : ;DO ( addr [xt] [colon-sys] -- ) postpone ; ( S addr xt ) @@ -560,9 +728,8 @@ Cond: DOES> restrict? \ Variables and Constants 05dec92py Build: ; -DO: ( ghost -- addr ) ;DO +by: :dovar ( ghost -- addr ) ;DO Builder Create -by Create :dovar resolve Build: T 0 , H ; by Create @@ -579,16 +746,15 @@ Variable tup 0 tup ! Variable tudp 0 tudp ! : u, ( n -- udp ) tup @ tudp @ + T ! H - tudp @ dup cell+ tudp ! ; + tudp @ dup T cell+ H tudp ! ; : au, ( n -- udp ) tup @ tudp @ + T A! H - tudp @ dup cell+ tudp ! ; + tudp @ dup T cell+ H tudp ! ; >TARGET Build: T 0 u, , H ; -DO: ( ghost -- up-addr ) T @ H tup @ + ;DO +by: :douser ( ghost -- up-addr ) T @ H tup @ + ;DO Builder User -by User :douser resolve Build: T 0 u, , 0 u, drop H ; by User @@ -598,23 +764,64 @@ Build: T 0 au, , H ; by User Builder AUser +Build: ( n -- ) ; +by: :docon ( ghost -- n ) T @ H ;DO +Builder (Constant) + Build: ( n -- ) T , H ; -DO: ( ghost -- n ) T @ H ;DO +by (Constant) Builder Constant -by Constant :docon resolve Build: ( n -- ) T A, H ; -by Constant +by (Constant) Builder AConstant -Build: T 0 , H ; -by Constant +Build: ( d -- ) T , , H ; +DO: ( ghost -- d ) T dup cell+ @ swap @ H ;DO +Builder 2Constant + +Build: T , H ; +by (Constant) Builder Value +Build: T A, H ; +by (Constant) +Builder AValue + Build: ( -- ) compile noop ; -DO: ( ghost -- ) ABORT" CROSS: Don't execute" ;DO +by: :dodefer ( ghost -- ) ABORT" CROSS: Don't execute" ;DO Builder Defer +Build: ( inter comp -- ) swap T immediate A, A, H ; +DO: ( ghost -- ) ABORT" CROSS: Don't execute" ;DO +Builder interpret/compile: + +\ Sturctures 23feb95py + +>CROSS +: nalign ( addr1 n -- addr2 ) +\ addr2 is the aligned version of addr1 wrt the alignment size n + 1- tuck + swap invert and ; +>TARGET + +Build: ; +by: :dofield T @ H + ;DO +Builder (Field) + +Build: >r rot r@ nalign dup T , H ( align1 size offset ) + + swap r> nalign ; +by (Field) +Builder Field + +: struct T 0 1 chars H ; +: end-struct T 2Constant H ; + +: cells: ( n -- size align ) + T cells 1 cells H ; + +\ ' 2Constant Alias2 end-struct +\ 0 1 T Chars H 2Constant struct + \ structural conditionals 17dec92py >CROSS @@ -658,6 +865,12 @@ Cond: AGAIN restrict? sys? compile b Cond: UNTIL restrict? sys? compile ?branch r compile over compile = compile IF compile drop + r> ;Cond +Cond: ENDOF restrict? >r compile ELSE r> ;Cond +Cond: ENDCASE restrict? compile drop 0 ?DO compile THEN LOOP ;Cond + \ Structural Conditionals 12dec92py Cond: DO restrict? compile (do) T here H ;Cond @@ -682,6 +895,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 +916,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,14 +937,16 @@ also minimal \ define new [IFDEF] and [IFUNDEF] 20may93jaw -: there? name gfind IF >magic @ <> ELSE drop false THEN ; +: defined? defined? ; +: needed? needed? ; +: doer? doer? ; -: [IFDEF] there? postpone [IF] ; -: [IFUNDEF] there? 0= postpone [IF] ; +: [IFDEF] defined? postpone [IF] ; +: [IFUNDEF] defined? 0= postpone [IF] ; \ C: \- \+ Conditional Compiling 09jun93jaw -: C: >in @ there? 0= +: C: >in @ defined? 0= IF >in ! T : H ELSE drop BEGIN bl word dup c@ @@ -741,8 +958,8 @@ also minimal also minimal -: \- there? IF postpone \ THEN ; -: \+ there? 0= IF postpone \ THEN ; +: \- defined? IF postpone \ THEN ; +: \+ defined? 0= IF postpone \ THEN ; : [IF] postpone [IF] ; : [THEN] postpone [THEN] ; @@ -762,27 +979,66 @@ Cond: [ELSE] [ELSE] ;Cond \ [THEN] \ included throw after create-file 11may93jaw -endian Constant endian +bigendian Constant bigendian + +Create magic s" Gforth10" here over allot swap move + +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 - image @ there r@ write-file throw - bit$ @ there 1- cell>bit rshift 1+ r@ write-file throw + NIL IF + 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 + ELSE + bl parse 2drop + THEN + image @ there r@ write-file throw \ write image + NIL IF + bit$ @ there 1- cell>bit rshift 1+ + r@ write-file throw \ write tags + THEN r> close-file throw ; \ words that should be in minimal -: + + ; : 1- 1- ; -: - - ; : 2* 2* ; -: dup dup ; : over over ; -: swap swap ; : rot rot ; +: here there ; +also forth [IFDEF] Label : Label Label ; [THEN] previous +: + + ; +: or or ; +: 1- 1- ; +: - - ; +: 2* 2* ; +: * * ; +: / / ; +: dup dup ; +: over over ; +: swap swap ; +: rot rot ; +: drop drop ; +: = = ; +: 0= 0= ; +: lshift lshift ; +: 2/ 2/ ; +: . . ; + +mach-file count included + +: all-words ['] false IS skip? ; +: needed-words ['] needed? IS skip? ; +: undef-words ['] defined? IS skip? ; -\ include bug5.fs -\ only forth also minimal definitions - -: \ postpone \ ; -: ( postpone ( ; +: \ postpone \ ; immediate +: ( postpone ( ; immediate : include bl word count included ; : .( [char] ) parse type ; : cr cr ; @@ -796,7 +1052,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 ;