--- gforth/cross.fs 1999/02/22 18:27:22 1.71 +++ gforth/cross.fs 1999/05/17 13:12:25 1.76 @@ -58,7 +58,7 @@ Warnings off \ 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 + set-order ELSE Value THEN ; : DefaultValue ( n -- ) @@ -118,9 +118,6 @@ also forth definitions \ these values m false DefaultValue stack-warn \ check on empty stack at any definition false DefaultValue create-forward-warn \ warn on forward declaration of created words -[IFUNDEF] DebugMaskSrouce Variable DebugMaskSource 0 DebugMaskSource ! [THEN] -[IFUNDEF] DebugMaskCross Variable DebugMaskCross 0 DebugMaskCross ! [THEN] - previous >CROSS : .dec @@ -143,7 +140,46 @@ stack-warn [IF] : defempty? ; immediate [THEN] +\ debugging + +0 [IF] +This implements debugflags for the cross compiler and the compiled +images. It works identical to the has-flags in the environment. +The debugflags are defined in a vocabluary. If the word exists and +its value is true, the flag is switched on. + +[THEN] + +Vocabulary debugflags \ debug flags for cross +also debugflags get-order over +Constant debugflags-wl +set-order previous + +: DebugFlag + get-current >r debugflags-wl set-current + SetValue + r> set-current ; + +: Debug? ( adr u -- flag ) +\G return true if debug flag is defined or switched on + debugflags-wl search-wordlist + IF EXECUTE + ELSE false THEN ; + +: D? ( -- flag ) +\G return true if debug flag is defined or switched on +\G while compiling we do not return the current value but + bl word count debug? ; + +: [d?] +\G compile the value-xt so the debug flag can be switched +\G the flag must exist! + bl word count debugflags-wl search-wordlist + IF compile, + ELSE -1 ABORT" unknown debug flag" + \ POSTPONE false + THEN ; immediate \ \ GhostNames Ghosts 9may93jaw @@ -171,13 +207,14 @@ VARIABLE VocTemp hex 4711 Constant 4712 Constant 4713 Constant 4714 Constant +4715 Constant \ iForth makes only immediate directly after create \ make atonce trick! ? Variable atonce atonce off -: NoExec true ABORT" CROSS: Don't execute ghost" ; +: NoExec true ABORT" CROSS: Don't execute ghost, or immediate target word" ; : GhostHeader , 0 , ['] NoExec , ; @@ -222,7 +259,7 @@ VARIABLE Already : ghost ( "name" -- ghost ) Already off - >in @ bl word gfind IF Already on nip EXIT THEN + >in @ bl word gfind IF atonce off Already on nip EXIT THEN drop >in ! Make-Ghost ; : >ghostname ( ghost -- adr len ) @@ -240,6 +277,9 @@ VARIABLE Already : forward? ( ghost -- flag ) >magic @ = ; +: undefined? ( ghost -- flag ) + >magic @ dup = swap = or ; + \ Predefined ghosts 12dec92py ghost 0= drop @@ -281,8 +321,7 @@ VARIABLE env-current \ save information : 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 - false true ABORT" arg" + false \ debug true ABORT" arg" THEN ; : $has? T environment? H IF ELSE false THEN ; @@ -315,6 +354,7 @@ false DefaultValue header true DefaultValue interpreter true DefaultValue ITC false DefaultValue rom +true DefaultValue standardthreading >TARGET s" relocate" T environment? H @@ -377,30 +417,6 @@ Variable bit$ Variable headers-named 0 headers-named ! Variable user-vars 0 user-vars ! -\ Memory initialisation 05dec92py - -[IFDEF] Memory \ Memory is a bigFORTH feature - also Memory - : initmem ( var len -- ) - 2dup swap handle! >r @ r> erase ; - toss -[ELSE] - : initmem ( var len -- ) - tuck allocate abort" CROSS: No memory for target" - ( len var adr ) dup rot ! - ( len adr ) swap erase ; -[THEN] - -\ MakeKernal 12dec92py - -: makekernel ( targetsize -- targetsize ) - bit$ over 1- tcell>bit rshift 1+ initmem - image over initmem ; - ->MINIMAL -: makekernel makekernel ; ->CROSS - : target>bitmask-size ( u1 -- u2 ) 1- tcell>bit rshift 1+ ; @@ -408,8 +424,6 @@ Variable user-vars 0 user-vars ! dup allocate ABORT" CROSS: No memory for target" swap over swap erase ; - - \ \ memregion.fs @@ -515,10 +529,10 @@ 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 0<> + \ address-space area nip 0<> ram-dictionary area nip 0<> rom-dictionary area nip 0<> - and and 0= + and 0= ABORT" CROSS: define address-space, rom- , ram-dictionary, with rom-support!" THEN address-space area nip @@ -543,12 +557,20 @@ T has? rom H r@ >rmem ! target>bitmask-size allocatetarget - dup - bit$ ! + dup bit$ ! r> >rbm ! ELSE r> drop THEN - REPEAT ; + REPEAT drop ; + +\ MakeKernal 22feb99jaw + +: makekernel ( targetsize -- targetsize ) + dup dictionary >rlen ! setup-target ; + +>MINIMAL +: makekernel makekernel ; +>CROSS \ \ switched tdp for rom support 03jun97jaw @@ -765,7 +787,7 @@ T has? relocate H \ \ Load Assembler >TARGET -H also Forth definitions \ ." asm: " order +H also Forth definitions : X also target bl word find IF state @ IF compile, @@ -883,8 +905,11 @@ Create NoFile ," #load-file#" REPEAT 2drop drop false ; +false DebugFlag showincludedfiles + : included -\ cr ." Including: " 2dup type ." ..." + [d?] showincludedfiles + IF cr ." Including: " 2dup type ." ..." THEN FileMem >r 2dup add-included-file included r> to FileMem ; @@ -987,7 +1012,7 @@ Exists-Warnings on \G resolve referencies to ghost with tcfa \ is ghost resolved?, second resolve means another definition with the \ same name - over forward? 0= IF exists EXIT THEN + over undefined? 0= IF exists EXIT THEN \ get linked-list swap >r r@ >link @ swap \ ( list tcfa R: ghost ) \ mark ghost as resolved @@ -1164,7 +1189,18 @@ Create tag-bof 1 c, 0C c, Defer skip? ' false IS skip? +: skipdef ( -- ) +\G skip definition of an undefined word in undef-words mode + ghost dup forward? + IF >magic swap ! + ELSE drop THEN ; + : defined? ( -- flag ) \ name + ghost undefined? 0= ; + +: defined2? ( -- flag ) \ name +\G return true for anything else than forward, even for +\G that's what we want ghost forward? 0= ; : needed? ( -- flag ) \ name @@ -1173,7 +1209,7 @@ Defer skip? ' false IS skip? \G a forward reference exists \G so the definition is not skipped! bl word gfind - IF dup forward? + IF dup undefined? nip 0= ELSE drop true THEN ; @@ -1222,8 +1258,12 @@ NoHeaderFlag off \ Symbol table \ >in @ cr ." sym:s/CFA=" there 4 0.r ." /" bl word count .sym ." /g" cr >in ! CreateFlag @ - IF + IF \ for a created word we need also a definition in target + \ to execute the created word while compile time + \ dont mind if a alias is defined twice + Warnings @ >r Warnings off >in @ alias2 swap >in ! \ create alias in target + r> Warnings ! >in @ ghost swap >in ! swap also ghosts ' previous swap ! \ tick ghost and store in alias CreateFlag off @@ -1306,7 +1346,7 @@ Comment ( Comment \ THEN ; immediate : ghost>cfa - dup forward? ABORT" CROSS: forward " >link @ ; + dup undefined? ABORT" CROSS: forward " >link @ ; >TARGET @@ -1540,7 +1580,7 @@ Cond: DOES> restrict? : gdoes, ( ghost -- ) \ makes the codefield for a word that is built - >end @ dup forward? 0= + >end @ dup undefined? 0= IF dup >magic @ = IF doer, @@ -2037,8 +2077,10 @@ Cond: [IFUNDEF] postpone [IFUNDEF] ;Cond also minimal -\G doesn't skip line when bit is set in debugmask -: \D name evaluate debugmasksource @ and 0= IF postpone \ THEN ; +: d? d? ; + +\G doesn't skip line when debug switch is on +: \D D? 0= IF postpone \ THEN ; \G interprets the line if word is not defined : \- defined? IF postpone \ THEN ; @@ -2162,7 +2204,8 @@ previous : all-words ['] false IS skip? ; : needed-words ['] needed? IS skip? ; -: undef-words ['] defined? IS skip? ; +: undef-words ['] defined2? IS skip? ; +: skipdef skipdef ; : \ postpone \ ; immediate : \G T-\G ; immediate @@ -2208,7 +2251,7 @@ minimal \ these ones are pefered: : lock turnkey ; -: unlock forth also cross ; +: unlock previous forth also cross ; : [[ also unlock ; : ]] previous previous ;