--- gforth/cross.fs 1998/10/25 23:15:46 1.57 +++ gforth/cross.fs 1999/02/21 11:43:12 1.69 @@ -1,7 +1,7 @@ \ CROSS.FS The Cross-Compiler 06oct92py \ Idea and implementation: Bernd Paysan (py) -\ Copyright (C) 1995 Free Software Foundation, Inc. +\ Copyright (C) 1995,1996,1997,1998,1999 Free Software Foundation, Inc. \ This file is part of Gforth. @@ -19,32 +19,17 @@ \ 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 -\ included place +place 12may93jaw -\ for a created word (variable, constant...) -\ is now an alias in the target voabulary. -\ this means it is no longer necessary to -\ switch between vocabularies for variable -\ initialization 12may93jaw -\ discovered error in DOES> -\ replaced !does with (;code) 16may93jaw -\ made complete redesign and -\ introduced two vocs method -\ to be asure that the right words -\ are found 08jun93jaw -\ btw: ! works not with 16 bit -\ targets 09jun93jaw -\ added: 2user and value 11jun93jaw - -\ needed? works better now!!! 01mar97jaw -\ mach file is only loaded into target -\ cell corrected -\ romable extansions 27apr97-5jun97jaw -\ environmental query support 01sep97jaw -\ added own [IF] ... [ELSE] ... [THEN] 14sep97jaw -\ extra resolver for doers 20sep97jaw -\ added killref for DOES> 20sep97jaw +0 +[IF] + +ToDo: +Crossdoc destination ./doc/crossdoc.fd makes no sense when +cross.fs is uses seperately. jaw +Do we need this char translation with >address and in branchoffset? +(>body also affected) jaw +Clean up mark> and >resolve stuff jaw + +[THEN] hex \ the defualt base for the cross-compiler is hex !! @@ -52,6 +37,7 @@ Warnings off \ words that are generaly useful +: KB 400 * ; : >wordlist ( vocabulary-xt -- wordlist-struct ) also execute get-order swap >r 1- set-order r> ; @@ -66,9 +52,14 @@ Warnings off \G Same behaviour as "Value" if the is not defined \G Same behaviour as "to" if is defined \G SetValue searches in the current vocabulary - save-input bl word >r restore-input throw r> count - get-current search-wordlist - IF ['] to execute ELSE Value THEN ; + save-input bl word >r restore-input throw r> count + get-current search-wordlist + IF drop >r + \ we have to set current to be topmost context wordlist + get-order get-order get-current swap 1+ set-order + r> ['] to execute + set-order order + ELSE Value THEN ; : DefaultValue ( n -- ) \G Same behaviour as "Value" if the is not defined @@ -281,13 +272,13 @@ VARIABLE env-current \ save information >TARGET -: environment? +: environment? ( adr len -- [ x ] true | false ) target-environment search-wordlist IF execute true ELSE false THEN ; -: e? name T environment? H 0= ABORT" environment variable not defined!" ; +: e? bl word count T environment? H 0= ABORT" environment variable not defined!" ; -: has? name T environment? H +: has? bl word count T environment? H IF \ environment variable is present, return its value ELSE \ environment variable is not present, return false \ !! JAW abort is just for testing @@ -302,6 +293,7 @@ true SetValue cross true SetValue standard-threading >TARGET previous + mach-file count included hex >ENVIRON @@ -334,7 +326,9 @@ s" relocate" T environment? H \ \ Create additional parameters 19jan95py -1 8 lshift Constant maxbyte +1 8 lshift Constant maxbyte +\ this sets byte size for the target machine, an (probably right guess) jaw + T NIL Constant TNIL cell Constant tcell @@ -381,9 +375,16 @@ Variable user-vars 0 user-vars ! >MINIMAL : makekernel makekernel ; +>CROSS + +: target>bitmask-size ( u1 -- u2 ) + 1- tcell>bit rshift 1+ ; + +: allocatetarget ( size --- adr ) + dup allocate ABORT" CROSS: No memory for target" + swap over swap erase ; ->CROSS \ \ memregion.fs @@ -394,6 +395,10 @@ Variable mirrored-link \ linked 0 dup mirrored-link ! region-link ! +: >rname 6 cells + ; +: >rbm 5 cells + ; +: >rmem 4 cells + ; +: >rlink 3 cells + ; : >rdp 2 cells + ; : >rlen cell+ ; : >rstart ; @@ -407,27 +412,28 @@ Variable mirrored-link \ linked save-input create restore-input throw here last-defined-region ! over ( startaddr ) , ( length ) , ( dp ) , - region-link linked name string, + region-link linked 0 , 0 , bl word count string, ELSE \ store new parameters in region bl word drop >body >r r@ last-defined-region ! - r@ cell+ ! dup r@ ! r> 2 cells + ! + r@ >rlen ! dup r@ >rstart ! r> >rdp ! THEN ; : borders ( region -- startaddr endaddr ) \G returns lower and upper region border - dup @ swap cell+ @ over + ; + dup >rstart @ swap >rlen @ over + ; : extent ( region -- startaddr len ) \G returns the really used area - dup @ swap 2 cells + @ over - ; + dup >rstart @ swap >rdp @ over - ; : area ( region -- startaddr totallen ) \G returns the total area - dup @ swap cell+ @ ; + dup >rstart swap >rlen @ ; : mirrored \G mark a region as mirrored mirrored-link - linked last-defined-region @ , ; + align linked last-defined-region @ , ; -: .addr +: .addr ( u -- ) +\G prints a 16 or 32 Bit nice hex value base @ >r hex tcell 2 u> IF s>d <# # # # # '. hold # # # # #> type @@ -441,18 +447,19 @@ Variable mirrored-link \ linked 0 region-link @ BEGIN dup WHILE dup @ REPEAT drop BEGIN dup - WHILE cr 3 cells - >r - r@ 4 cells + count tuck type + WHILE cr + 0 >rlink - >r + r@ >rname count tuck type 12 swap - 0 max spaces space - ." Start: " r@ @ dup .addr space - ." End: " r@ 1 cells + @ + .addr space - ." DP: " r> 2 cells + @ .addr + ." Start: " r@ >rstart @ dup .addr space + ." End: " r@ >rlen @ + .addr space + ." DP: " r> >rdp @ .addr REPEAT drop s" rom" T $has? H 0= ?EXIT cr ." Mirrored:" mirrored-link @ BEGIN dup - WHILE space dup cell+ @ 4 cells + count type @ + WHILE space dup cell+ @ >rname count type @ REPEAT drop cr ; @@ -484,9 +491,9 @@ T has? rom H : setup-target ( -- ) \G initialize targets memory space s" rom" T $has? H IF \ check for ram and rom... - address-space area nip - ram-dictionary area nip - rom-dictionary area nip + address-space area nip 0<> + ram-dictionary area nip 0<> + rom-dictionary area nip 0<> and and 0= ABORT" CROSS: define address-space, rom- , ram-dictionary, with rom-support!" THEN @@ -496,9 +503,28 @@ T has? rom H ELSE dictionary area THEN - dup 0= + nip 0= ABORT" CROSS: define at least address-space or dictionary!!" - + makekernel drop ; + + \ allocate target for each region + region-link + BEGIN @ dup + WHILE dup + 0 >rlink - >r + r@ >rlen @ + IF \ allocate mem + r@ >rlen @ dup + + allocatetarget dup image ! + r@ >rmem ! + + target>bitmask-size allocatetarget + dup + bit$ ! + r> >rbm ! + + ELSE r> drop THEN + REPEAT ; \ \ switched tdp for rom support 03jun97jaw @@ -534,16 +560,20 @@ variable fixed \ flag: true: no automat variable constflag constflag off +: activate ( region -- ) +\G next code goes to this region + >rdp to tdp ; + : (switchram) fixed @ ?EXIT s" rom" T $has? H 0= ?EXIT - ram-dictionary >rdp to tdp ; + ram-dictionary activate ; : switchram constflag @ IF constflag off ELSE (switchram) THEN ; : switchrom - fixed @ ?EXIT rom-dictionary >rdp to tdp ; + fixed @ ?EXIT rom-dictionary activate ; : >tempdp ( addr -- ) tdp tempdp-save ! tempdp to tdp tdp ! ; @@ -559,7 +589,7 @@ variable constflag constflag off \ : romstart dup sromdp ! romdp ! ; \ : ramstart dup sramdp ! ramdp ! ; -\ default compilation goed to rom +\ default compilation goes to rom \ when romable support is off, only the rom switch is used (!!) >auto @@ -606,7 +636,32 @@ bigendian DO maxbyte * swap maxbyte um* rot + swap I c@ + swap -1 +LOOP d>s ; [THEN] ->CROSS +: taddr>region ( taddr -- region | 0 ) +\G finds for a target-address the correct region +\G returns 0 if taddr is not in range of a target memory region + region-link + BEGIN @ dup + WHILE dup >r + 0 >rlink - >r + r@ >rlen @ + IF dup r@ borders within + IF r> r> drop nip EXIT THEN + THEN + r> drop + r> + REPEAT + 2drop 0 ; + +: (>regionimage) ( taddr -- 'taddr ) + dup + \ find region we want to address + taddr>region dup 0= ABORT" Address out of range!" + >r + \ calculate offset in region + r@ >rstart @ - + \ add regions real address in our memory + r> >rmem @ + ; + \ Bit string manipulation 06oct92py \ 9may93jaw CREATE Bittable 80 c, 40 c, 20 c, 10 c, 8 c, 4 c, 2 c, 1 c, @@ -615,8 +670,27 @@ 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 ; + +: (relon) ( taddr -- ) bit$ @ swap cell/ +bit ; +: (reloff) ( taddr -- ) bit$ @ swap cell/ -bit ; + +: (>image) ( taddr -- absaddr ) image @ + ; + +DEFER >image +DEFER relon +DEFER reloff +DEFER correcter + +T has? relocate H +[IF] +' (relon) IS relon +' (reloff) IS reloff +' (>image) IS >image +[ELSE] +' drop IS relon +' drop IS reloff +' (>regionimage) IS >image +[THEN] \ Target memory access 06oct92py @@ -634,9 +708,6 @@ CREATE Bittable 80 c, 40 c, 20 c, 10 c, \ see kernel.fs dup cfalign+ + ; ->CROSS -: >image ( taddr -- absaddr ) image @ + ; ->TARGET : @ ( taddr -- w ) >image S@ ; : ! ( w taddr -- ) >image S! ; : c@ ( taddr -- char ) >image Sc@ ; @@ -651,12 +722,13 @@ CREATE Bittable 80 c, 40 c, 20 c, 10 c, : allot ( n -- ) tdp +! ; : , ( w -- ) T here H tcell T allot ! H T here drop H ; : c, ( char -- ) T here tchar allot c! H ; -: align ( -- ) T here H align+ 0 ?DO bl T c, H LOOP ; +: align ( -- ) T here H align+ 0 ?DO bl T c, tchar H +LOOP ; : cfalign ( -- ) - T here H cfalign+ 0 ?DO bl T c, H LOOP ; + T here H cfalign+ 0 ?DO bl T c, tchar H +LOOP ; -: A! dup relon T ! H ; -: A, ( w -- ) T here H relon T , H ; +: >address dup 0>= IF tchar / THEN ; \ ?? jaw +: A! swap >address swap dup relon T ! H ; +: A, ( w -- ) >address T here H relon T , H ; >CROSS @@ -666,6 +738,8 @@ CREATE Bittable 80 c, 40 c, 20 c, 10 c, ?DO dup T c@ H I T c! H 1+ tchar +LOOP drop ; +\ \ Load Assembler + >TARGET H also Forth definitions \ ." asm: " order @@ -763,8 +837,9 @@ DEFER comp[ \ ends compilation : >fl-name 2 cells + ; Variable filelist 0 filelist ! +Create NoFile ," #load-file#" 0 Value filemem -: loadfile filemem >fl-name ; +: loadfile FileMem ?dup IF >fl-name ELSE NoFile THEN ; 1 [IF] \ !! JAW WIP @@ -1115,7 +1190,7 @@ NoHeaderFlag off IF NoHeaderFlag off ELSE T align H view, - tlast @ dup 0> IF T 1 cells - THEN A, H there tlast ! + tlast @ dup 0> IF T 1 cells - H THEN T A, H there tlast ! 1 headers-named +! \ Statistic >in @ T name, H >in ! THEN @@ -1161,6 +1236,11 @@ VARIABLE ;Resolve 1 cells allot .sourcepos ." needs doer: " >in @ bl word count type >in ! cr THEN ghost tuck swap resolve swap >magic ! ; + +Variable prim# +: first-primitive ( n -- ) prim# ! ; +: Primitive ( -- ) \ name + prim# @ T Alias H -1 prim# +! ; >CROSS \ Conditionals and Comments 11may93jaw @@ -1223,7 +1303,7 @@ Cond: ['] T ' H alit, ;Cond \ modularized 14jun97jaw : fillcfa ( usedcells -- ) - T cells H xt>body swap - 0 ?DO 0 T c, H LOOP ; + T cells H xt>body swap - 0 ?DO 0 T c, tchar H +LOOP ; : (>body) ( cfa -- pfa ) xt>body + ; ' (>body) T IS >body H @@ -1244,7 +1324,13 @@ Cond: ['] T ' H alit, ;Cond : (lit,) ( n -- ) compile lit T , H ; ' (lit,) IS lit, -: (alit,) ( n -- ) lit, T here cell - H relon ; ' (alit,) IS alit, +\ if we dont produce relocatable code alit, defaults to lit, jaw +has? relocate +[IF] +: (alit,) ( n -- ) compile lit T a, H ; ' (alit,) IS alit, +[ELSE] +: (alit,) ( n -- ) lit, ; ' (alit,) IS alit, +[THEN] : (fini,) compile ;s ; ' (fini,) IS fini, @@ -1631,7 +1717,7 @@ Builder Field : sys? ( sys -- sys ) dup 0= ?struc ; : >mark ( -- sys ) T here ( dup ." M" hex. ) 0 , H ; -: branchoffset ( src dest -- ) - ; +: branchoffset ( src dest -- ) - tchar / ; \ ?? jaw : >resolve ( sys -- ) T here ( dup ." >" hex. ) over branchoffset swap ! H ; @@ -1755,7 +1841,7 @@ Cond: ENDCASE restrict? compile drop 0 \ Structural Conditionals 12dec92py -:noname +:noname \ ?? i think 0 is too much! jaw 0 compile (do) branchtomark, 2 to1 ; IS do, ( -- target-addr ) @@ -1796,7 +1882,7 @@ Cond: S" restrict? compile (S") Cond: ABORT" restrict? compile (ABORT") T ," H ;Cond Cond: IS T ' >body H compile ALiteral compile ! ;Cond -: IS T ' >body ! H ; +: IS T >address ' >body ! H ; Cond: TO T ' >body H compile ALiteral compile ! ;Cond : TO T ' >body ! H ; @@ -1951,9 +2037,18 @@ previous \ save-cross 17mar93py >CROSS -Create magic s" Gforth10" here over allot swap move +Create magic s" Gforth2x" here over allot swap move -char 1 bigendian + tcell + magic 7 + c! +bigendian 1+ \ strangely, in magic big=0, little=1 +tcell 1 = 0 and or +tcell 2 = 2 and or +tcell 4 = 4 and or +tcell 8 = 6 and or +tchar 1 = $00 and or +tchar 2 = $28 and or +tchar 4 = $50 and or +tchar 8 = $78 and or +magic 7 + c! : save-cross ( "image-name" "binary-name" -- ) bl parse ." Saving to " 2dup type cr @@ -1982,7 +2077,7 @@ char 1 bigendian + tcell + magic 7 + c! : save-region ( addr len -- ) bl parse w/o bin create-file throw >r - swap image @ + swap r@ write-file throw + swap >image swap r@ write-file throw r> close-file throw ; \ words that should be in minimal @@ -1994,6 +2089,8 @@ also minimal bigendian Constant bigendian : here there ; +: equ constant ; +: mark there constant ; \ compiler directives : >ram >ram ; @@ -2003,7 +2100,8 @@ bigendian Constant bigendian : tempdp> tempdp> ; : const constflag on ; : warnings name 3 = 0= twarnings ! drop ; -: | NoHeaderFlag on ; +: | ; +\ : | NoHeaderFlag on ; \ This is broken (damages the last word) : save-cross save-cross ; : save-region save-region ;