--- gforth/cross.fs 1994/11/29 16:22:37 1.17 +++ gforth/cross.fs 1995/09/06 21:00:11 1.28 @@ -1,5 +1,5 @@ \ CROSS.FS The Cross-Compiler 06oct92py -\ $Id: cross.fs,v 1.17 1994/11/29 16:22:37 pazsan Exp $ +\ $Id: cross.fs,v 1.28 1995/09/06 21:00:11 pazsan Exp $ \ Idea and implementation: Bernd Paysan (py) \ Copyright 1992-94 by the GNU Forth Development Group @@ -23,6 +23,10 @@ \ 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 ( @@ -39,10 +43,10 @@ decimal VARIABLE GhostNames 0 GhostNames ! : GhostName ( -- addr ) - here GhostNames @ , GhostNames ! here 0 , - bl word 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 @@ -86,17 +90,28 @@ Variable tdp included +\ Create additional parameters 19jan95py + +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 @@ -105,17 +120,23 @@ included -4 Constant :dovar -5 Constant :douser -6 Constant :dodefer --7 Constant :dodoes --8 Constant :doesjump +-7 Constant :dostruc +-8 Constant :dodoes +-9 Constant :doesjump >CROSS -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 - [ 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 @@ -156,16 +177,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 kernal.fs:cfaligned + float tuck 1- and - [ float 1- ] Literal and ; >TARGET : aligned ( taddr -- ta-addr ) dup align+ + ; \ assumes cell alignment granularity (as GNU C) +: cfaligned ( taddr1 -- taddr2 ) + \ see kernal.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 ; @@ -179,6 +207,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 ; @@ -256,9 +286,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 -- ) @@ -312,7 +342,7 @@ VARIABLE ^imm >TARGET : immediate 20 flag! - ^imm @ @ dup = ?EXIT + ^imm @ @ dup = IF drop EXIT THEN <> ABORT" CROSS: Cannot immediate a unresolved word" ^imm @ ! ; : restrict 40 flag! ; @@ -322,30 +352,94 @@ VARIABLE ^imm : 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" -- ) bl word 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 + +: \G ( -- ) + source >in @ /string doc-file-id write-line throw + source >in ! drop ; immediate + +Variable to-doc + +: 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 + POSTPONE \g + >in ! + THEN to-doc on ; + +\ Target TAGS creation + +s" 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 + loadfilename 2@ 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 loadline @ 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 : (Theader ( "name" -- ghost ) 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 @@ -354,6 +448,7 @@ 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 @@ -547,10 +642,10 @@ 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 ; @@ -575,6 +670,10 @@ Build: ( n -- ) T A, H ; 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 Builder Value @@ -584,6 +683,29 @@ DO: ( ghost -- ) ABORT" CROSS: Don't exe Builder Defer by Defer :dodefer resolve +\ 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: >r rot r@ nalign dup T , H ( align1 size offset ) + + swap r> nalign ; +DO: T @ H + ;DO +Builder Field +by Field :dostruc resolve + +: 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 @@ -735,10 +857,14 @@ Cond: [ELSE] [ELSE] ;Cond bigendian Constant bigendian +Create magic s" gforth00" here over allot swap move + +[char] 1 bigendian + cell + magic 7 + c! + : save-cross ( "name" -- ) bl parse ." Saving to " 2dup type w/o bin create-file throw >r - s" gforth00" r@ write-file throw \ write magic + magic 8 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 @@ -751,15 +877,17 @@ bigendian Constant bigendian : * * ; : / / ; : dup dup ; : over over ; : swap swap ; : rot rot ; -: drop drop ; +: drop drop ; : = = ; : lshift lshift ; : 2/ 2/ ; +: . . ; cell constant cell \ include bug5.fs \ only forth also minimal definitions -: \ postpone \ ; -: ( postpone ( ; +: \ postpone \ ; +: \G postpone \G ; +: ( postpone ( ; : include bl word count included ; : .( [char] ) parse type ; : cr cr ;