| \ along with this program; if not, write to the Free Software |
\ along with this program; if not, write to the Free Software |
| \ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
\ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
| |
|
| \ Log: |
0 |
| \ changed in ; [ to state off 12may93jaw |
[IF] |
| \ included place +place 12may93jaw |
|
| \ for a created word (variable, constant...) |
ToDo: |
| \ is now an alias in the target voabulary. |
Crossdoc destination ./doc/crossdoc.fd makes no sense when |
| \ this means it is no longer necessary to |
cross.fs is uses seperately. jaw |
| \ switch between vocabularies for variable |
Do we need this char translation with >address and in branchoffset? |
| \ initialization 12may93jaw |
(>body also affected) jaw |
| \ discovered error in DOES> |
Clean up mark> and >resolve stuff jaw |
| \ replaced !does with (;code) 16may93jaw |
|
| \ made complete redesign and |
[THEN] |
| \ 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 |
|
| |
|
| |
|
| hex \ the defualt base for the cross-compiler is hex !! |
hex \ the defualt base for the cross-compiler is hex !! |
| |
|
| >TARGET |
>TARGET |
| |
|
| : environment? |
: environment? ( adr len -- [ x ] true | false ) |
| target-environment search-wordlist |
target-environment search-wordlist |
| IF execute true ELSE false THEN ; |
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 |
IF \ environment variable is present, return its value |
| ELSE \ environment variable is not present, return false |
ELSE \ environment variable is not present, return false |
| \ !! JAW abort is just for testing |
\ !! JAW abort is just for testing |
| \ \ Create additional parameters 19jan95py |
\ \ 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 |
T |
| NIL Constant TNIL |
NIL Constant TNIL |
| cell Constant tcell |
cell Constant tcell |
| |
|
| >MINIMAL |
>MINIMAL |
| : makekernel makekernel ; |
: 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 |
\ \ memregion.fs |
| |
|
| 0 dup mirrored-link ! region-link ! |
0 dup mirrored-link ! region-link ! |
| |
|
| |
|
| |
: >rname 6 cells + ; |
| |
: >rbm 5 cells + ; |
| |
: >rmem 4 cells + ; |
| |
: >rlink 3 cells + ; |
| : >rdp 2 cells + ; |
: >rdp 2 cells + ; |
| : >rlen cell+ ; |
: >rlen cell+ ; |
| : >rstart ; |
: >rstart ; |
| save-input create restore-input throw |
save-input create restore-input throw |
| here last-defined-region ! |
here last-defined-region ! |
| over ( startaddr ) , ( length ) , ( dp ) , |
over ( startaddr ) , ( length ) , ( dp ) , |
| region-link linked name string, |
region-link linked 0 , 0 , bl word count string, |
| ELSE \ store new parameters in region |
ELSE \ store new parameters in region |
| bl word drop |
bl word drop |
| >body >r r@ last-defined-region ! |
>body >r r@ last-defined-region ! |
| r@ cell+ ! dup r@ ! r> 2 cells + ! |
r@ >rlen ! dup r@ >rstart ! r> >rdp ! |
| THEN ; |
THEN ; |
| |
|
| : borders ( region -- startaddr endaddr ) \G returns lower and upper region border |
: 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 |
: 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 |
: area ( region -- startaddr totallen ) \G returns the total area |
| dup @ swap cell+ @ ; |
dup >rstart swap >rlen @ ; |
| |
|
| : mirrored \G mark a region as mirrored |
: mirrored \G mark a region as mirrored |
| mirrored-link |
mirrored-link |
| linked last-defined-region @ , ; |
linked last-defined-region @ , ; |
| |
|
| : .addr |
: .addr ( u -- ) |
| |
\G prints a 16 or 32 Bit nice hex value |
| base @ >r hex |
base @ >r hex |
| tcell 2 u> |
tcell 2 u> |
| IF s>d <# # # # # '. hold # # # # #> type |
IF s>d <# # # # # '. hold # # # # #> type |
| 0 region-link @ |
0 region-link @ |
| BEGIN dup WHILE dup @ REPEAT drop |
BEGIN dup WHILE dup @ REPEAT drop |
| BEGIN dup |
BEGIN dup |
| WHILE cr 3 cells - >r |
WHILE cr |
| r@ 4 cells + count tuck type |
0 >rlink - >r |
| |
r@ >rname count tuck type |
| 12 swap - 0 max spaces space |
12 swap - 0 max spaces space |
| ." Start: " r@ @ dup .addr space |
." Start: " r@ >rstart @ dup .addr space |
| ." End: " r@ 1 cells + @ + .addr space |
." End: " r@ >rlen @ + .addr space |
| ." DP: " r> 2 cells + @ .addr |
." DP: " r> >rdp @ .addr |
| REPEAT drop |
REPEAT drop |
| s" rom" T $has? H 0= ?EXIT |
s" rom" T $has? H 0= ?EXIT |
| cr ." Mirrored:" |
cr ." Mirrored:" |
| mirrored-link @ |
mirrored-link @ |
| BEGIN dup |
BEGIN dup |
| WHILE space dup cell+ @ 4 cells + count type @ |
WHILE space dup cell+ @ >rname count type @ |
| REPEAT drop cr |
REPEAT drop cr |
| ; |
; |
| |
|
| : setup-target ( -- ) \G initialize targets memory space |
: setup-target ( -- ) \G initialize targets memory space |
| s" rom" T $has? H |
s" rom" T $has? H |
| IF \ check for ram and rom... |
IF \ check for ram and rom... |
| address-space area nip |
address-space area nip 0<> |
| ram-dictionary area nip |
ram-dictionary area nip 0<> |
| rom-dictionary area nip |
rom-dictionary area nip 0<> |
| and and 0= |
and and 0= |
| ABORT" CROSS: define address-space, rom- , ram-dictionary, with rom-support!" |
ABORT" CROSS: define address-space, rom- , ram-dictionary, with rom-support!" |
| THEN |
THEN |
| ELSE |
ELSE |
| dictionary area |
dictionary area |
| THEN |
THEN |
| dup 0= |
nip 0= |
| ABORT" CROSS: define at least address-space or dictionary!!" |
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 |
\ \ switched tdp for rom support 03jun97jaw |
| |
|
| |
|
| variable constflag constflag off |
variable constflag constflag off |
| |
|
| |
: activate ( region -- ) |
| |
\G next code goes to this region |
| |
>rdp to tdp ; |
| |
|
| : (switchram) |
: (switchram) |
| fixed @ ?EXIT s" rom" T $has? H 0= ?EXIT |
fixed @ ?EXIT s" rom" T $has? H 0= ?EXIT |
| ram-dictionary >rdp to tdp ; |
ram-dictionary activate ; |
| |
|
| : switchram |
: switchram |
| constflag @ |
constflag @ |
| IF constflag off ELSE (switchram) THEN ; |
IF constflag off ELSE (switchram) THEN ; |
| |
|
| : switchrom |
: switchrom |
| fixed @ ?EXIT rom-dictionary >rdp to tdp ; |
fixed @ ?EXIT rom-dictionary activate ; |
| |
|
| : >tempdp ( addr -- ) |
: >tempdp ( addr -- ) |
| tdp tempdp-save ! tempdp to tdp tdp ! ; |
tdp tempdp-save ! tempdp to tdp tdp ! ; |
| \ : romstart dup sromdp ! romdp ! ; |
\ : romstart dup sromdp ! romdp ! ; |
| \ : ramstart dup sramdp ! ramdp ! ; |
\ : 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 (!!) |
\ when romable support is off, only the rom switch is used (!!) |
| >auto |
>auto |
| |
|
| DO maxbyte * swap maxbyte um* rot + swap I c@ + swap -1 +LOOP d>s ; |
DO maxbyte * swap maxbyte um* rot + swap I c@ + swap -1 +LOOP d>s ; |
| [THEN] |
[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 |
\ Bit string manipulation 06oct92py |
| \ 9may93jaw |
\ 9may93jaw |
| CREATE Bittable 80 c, 40 c, 20 c, 10 c, 8 c, 4 c, 2 c, 1 c, |
CREATE Bittable 80 c, 40 c, 20 c, 10 c, 8 c, 4 c, 2 c, 1 c, |
| : >bit ( addr n -- c-addr mask ) 8 /mod rot + swap bits ; |
: >bit ( addr n -- c-addr mask ) 8 /mod rot + swap bits ; |
| : +bit ( addr n -- ) >bit over c@ or swap c! ; |
: +bit ( addr n -- ) >bit over c@ or swap c! ; |
| : -bit ( addr n -- ) >bit invert over c@ and 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 |
| |
' (correcter) IS >image |
| |
[THEN] |
| |
|
| \ Target memory access 06oct92py |
\ Target memory access 06oct92py |
| |
|
| \ see kernel.fs |
\ see kernel.fs |
| dup cfalign+ + ; |
dup cfalign+ + ; |
| |
|
| >CROSS |
|
| : >image ( taddr -- absaddr ) image @ + ; |
|
| >TARGET |
|
| : @ ( taddr -- w ) >image S@ ; |
: @ ( taddr -- w ) >image S@ ; |
| : ! ( w taddr -- ) >image S! ; |
: ! ( w taddr -- ) >image S! ; |
| : c@ ( taddr -- char ) >image Sc@ ; |
: c@ ( taddr -- char ) >image Sc@ ; |
| : allot ( n -- ) tdp +! ; |
: allot ( n -- ) tdp +! ; |
| : , ( w -- ) T here H tcell T allot ! H T here drop H ; |
: , ( w -- ) T here H tcell T allot ! H T here drop H ; |
| : c, ( char -- ) T here tchar allot c! 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 ( -- ) |
: cfalign ( -- ) |
| T here H cfalign+ 0 ?DO bl T c, tchar H +LOOP ; |
T here H cfalign+ 0 ?DO bl T c, tchar H +LOOP ; |
| |
|
| : >address dup 0>= IF tchar / THEN ; |
: >address dup 0>= IF tchar / THEN ; \ ?? jaw |
| : A! swap >address swap dup relon T ! H ; |
: A! swap >address swap dup relon T ! H ; |
| : A, ( w -- ) >address T here H relon T , H ; |
: A, ( w -- ) >address T here H relon T , H ; |
| |
|
| ?DO dup T c@ H I T c! H 1+ |
?DO dup T c@ H I T c! H 1+ |
| tchar +LOOP drop ; |
tchar +LOOP drop ; |
| |
|
| |
\ \ Load Assembler |
| |
|
| >TARGET |
>TARGET |
| H also Forth definitions \ ." asm: " order |
H also Forth definitions \ ." asm: " order |
| |
|
| : >fl-name 2 cells + ; |
: >fl-name 2 cells + ; |
| |
|
| Variable filelist 0 filelist ! |
Variable filelist 0 filelist ! |
| |
Create NoFile ," #load-file#" |
| 0 Value filemem |
0 Value filemem |
| : loadfile filemem >fl-name ; |
: loadfile FileMem ?dup IF >fl-name ELSE NoFile THEN ; |
| |
|
| 1 [IF] \ !! JAW WIP |
1 [IF] \ !! JAW WIP |
| |
|
| |
|
| : (lit,) ( n -- ) compile lit T , H ; ' (lit,) IS lit, |
: (lit,) ( n -- ) compile lit T , H ; ' (lit,) IS lit, |
| |
|
| |
\ if we dont produce relocatable code alit, defaults to lit, jaw |
| |
has? relocate |
| |
[IF] |
| : (alit,) ( n -- ) compile lit T a, H ; ' (alit,) IS alit, |
: (alit,) ( n -- ) compile lit T a, H ; ' (alit,) IS alit, |
| |
[ELSE] |
| |
: (alit,) ( n -- ) lit, ; ' (alit,) IS alit, |
| |
[THEN] |
| |
|
| : (fini,) compile ;s ; ' (fini,) IS fini, |
: (fini,) compile ;s ; ' (fini,) IS fini, |
| |
|
| : sys? ( sys -- sys ) dup 0= ?struc ; |
: sys? ( sys -- sys ) dup 0= ?struc ; |
| : >mark ( -- sys ) T here ( dup ." M" hex. ) 0 , H ; |
: >mark ( -- sys ) T here ( dup ." M" hex. ) 0 , H ; |
| |
|
| : branchoffset ( src dest -- ) - tchar / ; |
: branchoffset ( src dest -- ) - tchar / ; \ ?? jaw |
| |
|
| : >resolve ( sys -- ) T here ( dup ." >" hex. ) over branchoffset swap ! H ; |
: >resolve ( sys -- ) T here ( dup ." >" hex. ) over branchoffset swap ! H ; |
| |
|
| |
|
| \ Structural Conditionals 12dec92py |
\ Structural Conditionals 12dec92py |
| |
|
| :noname |
:noname \ ?? i think 0 is too much! jaw |
| 0 compile (do) |
0 compile (do) |
| branchtomark, 2 to1 ; |
branchtomark, 2 to1 ; |
| IS do, ( -- target-addr ) |
IS do, ( -- target-addr ) |
| |
|
| : save-region ( addr len -- ) |
: save-region ( addr len -- ) |
| bl parse w/o bin create-file throw >r |
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 ; |
r> close-file throw ; |
| |
|
| \ words that should be in minimal |
\ words that should be in minimal |
| |
|
| bigendian Constant bigendian |
bigendian Constant bigendian |
| : here there ; |
: here there ; |
| |
: equ constant ; |
| |
: mark there constant ; |
| |
|
| \ compiler directives |
\ compiler directives |
| : >ram >ram ; |
: >ram >ram ; |