--- gforth/cross.fs 1995/12/23 16:21:56 1.33 +++ gforth/cross.fs 1997/02/12 00:25:34 1.45 @@ -91,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 @@ -102,10 +113,6 @@ Variable bit$ Variable tdp : there tdp @ ; -\ Parameter for target systems 06oct92py - -included - \ Create additional parameters 19jan95py T @@ -131,14 +138,6 @@ H >TARGET 20 CONSTANT bl -1 Constant NIL --2 Constant :docol --3 Constant :docon --4 Constant :dovar --5 Constant :douser --6 Constant :dodefer --7 Constant :dofield --8 Constant :dodoes --9 Constant :doesjump >CROSS @@ -173,7 +172,7 @@ bigendian \ MakeKernal 12dec92py >MINIMAL -: makekernal ( targetsize -- targetsize ) +: makekernel ( targetsize -- targetsize ) bit$ over 1- cell>bit rshift 1+ initmem image over initmem tdp off ; @@ -194,15 +193,15 @@ 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 - float tuck 1- and - [ float 1- ] Literal and ; + \ 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 kernal.fs + \ see kernel.fs dup cfalign+ + ; >CROSS @@ -233,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 @@ -252,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! ? @@ -263,7 +257,9 @@ 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 @@ -278,9 +274,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 @@ -357,11 +352,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 @@ -382,11 +377,11 @@ VARIABLE ^imm s" crossdoc.fd" r/w create-file throw value doc-file-id \ contains the file-id of the documentation file -: \G ( -- ) +: T-\G ( -- ) source >in @ /string doc-file-id write-line throw - source >in ! drop ; immediate + postpone \ ; -Variable to-doc +Variable to-doc to-doc on : cross-doc-entry ( -- ) to-doc @ tlast @ 0<> and \ not an anonymous (i.e. noname) header @@ -399,13 +394,13 @@ Variable to-doc [char] ) parse doc-file-id write-file throw s" )" doc-file-id write-file throw [char] \ parse 2drop - POSTPONE \g + T-\G >in ! - THEN to-doc on ; + THEN ; \ Target TAGS creation -s" kernal.TAGS" r/w create-file throw value tag-file-id +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, @@ -438,11 +433,30 @@ Create tag-bof 1 c, 0C c, 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 @@ -464,8 +478,19 @@ VARIABLE ;Resolve 1 cells allot >TARGET : Alias ( cfa -- ) \ name - dup 0< IF to-doc off THEN - (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 @@ -501,7 +526,9 @@ ghost unloop ghost ;S ghost lit ghost (compile) ghost ! 2drop drop ghost (does>) ghost noop 2drop ghost (.") ghost (S") ghost (ABORT") 2drop drop -ghost ' +ghost ' drop +ghost :docol ghost :doesjump ghost :dodoes 2drop drop +ghost over ghost = ghost drop 2drop drop \ compile 10may93jaw @@ -513,7 +540,31 @@ ghost ' 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 +: 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 @ ; @@ -528,12 +579,38 @@ Cond: chars ;Cond : 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 @@ -566,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 @@ -583,7 +664,8 @@ 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? @@ -604,8 +686,11 @@ Cond: DOES> restrict? \ 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 ( -- ) last-ghost @ @@ -628,6 +713,10 @@ Cond: DOES> restrict? here ghostheader :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 ) over >exec ! ; immediate @@ -639,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 @@ -665,9 +753,8 @@ Variable tudp 0 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 @@ -677,31 +764,37 @@ 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: ( d -- ) T , , H ; DO: ( ghost -- d ) T dup cell+ @ swap @ H ;DO Builder 2Constant -Build: T 0 , H ; -by Constant +Build: T , H ; +by (Constant) Builder Value -Build: T 0 A, H ; -by Constant +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 -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 @@ -711,11 +804,14 @@ by Defer :dodefer resolve 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 ; -DO: T @ H + ;DO +by (Field) Builder Field -by Field :dofield resolve : struct T 0 1 chars H ; : end-struct T 2Constant H ; @@ -769,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 @@ -835,14 +937,16 @@ also minimal \ define new [IFDEF] and [IFUNDEF] 20may93jaw -: there? bl word 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@ @@ -854,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] ; @@ -877,37 +981,64 @@ 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 - magic 8 r@ write-file throw \ write magic + 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 - bit$ @ there 1- cell>bit rshift 1+ + 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 ; -: drop drop ; : = = ; -: lshift lshift ; : 2/ 2/ ; +: 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/ ; : . . ; -cell constant cell -\ include bug5.fs -\ only forth also minimal definitions +mach-file count included -: \ postpone \ ; -: \G postpone \G ; -: ( postpone ( ; +: all-words ['] false IS skip? ; +: needed-words ['] needed? IS skip? ; +: undef-words ['] defined? IS skip? ; + +: \ postpone \ ; immediate +: ( postpone ( ; immediate : include bl word count included ; : .( [char] ) parse type ; : cr cr ; @@ -921,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 ;