VolksForth/sources/AtariST/TARGET.fth
2020-07-20 23:47:02 +02:00

681 lines
42 KiB
Forth

\ *** Block No. 0 Hexblock 0
\\ *** volksFORTH-84 Target-Compiler ***
Mit dem Target-Compiler l„žt sich ein neues System aus dem
Quelltext FORTH_83.SCR 'hochziehen'.
\ *** Block No. 1 Hexblock 1
\ Target compiler loadscr 09sep86we
\ Idea and first Implementation by ks/bp
\ Implemented on 6502 by ks/bp
\ ultraFORTH83-Version by bp/we
\ Atari 520 ST - Version by we
Onlyforth Assembler nonrelocate
07 Constant imagepage \ Virtual memory bank
Vocabulary Ttools
Vocabulary Defining
: .stat .blk .s ; ' .stat Is .status
1 $12 +thru \ Target compiler
$13 $15 +thru \ Target Tools
$16 $18 +thru \ Redefinitions
save $19 $22 +thru \ Predefinitions
\ *** Block No. 2 Hexblock 2
\ Target header pointers bp05mar86we
Variable tdp : there tdp @ ;
Variable displace
Variable ?thead 0 ?thead !
Variable tlast 0 tlast !
Variable glast' 0 glast' !
Variable tdoes>
Variable >in:
Variable tvoc 0 tvoc !
Variable tvoc-link 0 tvoc-link !
Variable tnext-link 0 tnext-link !
: c+! ( 8b addr -- ) dup c@ rot + swap c! ;
\ *** Block No. 3 Hexblock 3
\ Image and byteorder 15sep86we
: >image ( addr1 - addr2 ) displace @ - ;
: >heap ( from quan - )
heap over - 1 and + \ 68000-align
dup hallot heap swap cmove ;
\\
: >ascii 2drop ; ' noop Alias C64>ascii
Code Lc@ ( laddr -- 8b )
.l SP )+ A0 move .w D0 clr .b A0 ) D0 move
.w D0 SP -) move Next end-code
Code Lc! ( 8b addr -- )
.l SP )+ A0 move .w SP )+ D0 move .b D0 A0 ) move
Next end-code
\ *** Block No. 4 Hexblock 4
\ Ghost-creating 05mar86we
0 | Constant <forw> 0 | Constant <res>
| : Make.ghost ( - cfa.ghost )
here dup 1 and allot here
state @ IF context @ ELSE current THEN @
dup @ , name
dup c@ 1 $1F uwithin not abort" inval.Gname"
dup c@ 1+ over c!
c@ dup 1+ allot 1 and 0= IF bl c, THEN
here 2 pick - -rot
<forw> , 0 , 0 ,
swap here over - >heap
heap swap ! swap dp !
heap + ;
\ *** Block No. 5 Hexblock 5
\ ghost words 05mar86we
: gfind ( string - cfa tf / string ff )
dup count + 1+ bl swap c!
dup >r 1 over c+! find -1 r> c+! ;
: ghost ( - cfa )
>in @ name gfind IF nip exit THEN
drop >in ! Make.ghost ;
: Word, ghost execute ;
: gdoes> ( cfa.ghost - cfa.does )
4+ dup @ IF @ exit THEN
here dup <forw> , 0 , 4 >heap
dp ! heap dup rot ! ;
\ *** Block No. 6 Hexblock 6
\ ghost utilities 04dec85we
: g' name gfind 0= abort" ?" ;
: '.
g' dup @ <forw> case?
IF ." forw" ELSE <res> - abort" ??" ." res" THEN
2+ dup @ 5 u.r
2+ @ ?dup
IF dup @ <forw> case?
IF ." fdef" ELSE <res> - abort" ??" ." rdef" THEN
2+ @ 5 u.r THEN ;
' ' Alias h'
\ *** Block No. 7 Hexblock 7
\ .unresolved 05mar86we
| : forward? ( cfa - cfa / exit&true )
dup @ <forw> = over 2+ @ and IF drop true rdrop exit THEN ;
| : unresolved? ( addr - f )
2+ dup c@ $1F and over + c@ BL =
IF name> forward? 4+ @ dup IF forward? THEN
THEN drop false ;
| : unresolved-words
BEGIN @ ?dup WHILE dup unresolved?
IF dup 2+ .name ?cr THEN REPEAT ;
: .unresolved voc-link @
BEGIN dup 4- unresolved-words @ ?dup 0= UNTIL ;
\ *** Block No. 8 Hexblock 8
\ Extending Vocabularys for Target-Compilation 05mar86we
: Vocabulary Vocabulary 0 , here tvoc @ , tvoc ! ;
Vocabulary Transient 0 tvoc !
Only definitions Forth also
: T Transient ; immediate
: H Forth ; immediate
definitions
\ *** Block No. 9 Hexblock 9
\ Transient primitives 05mar86we
Code byte> ( 8bh 8bl -- 16b )
SP )+ D1 move SP ) D0 move 8 # D0 lsl .b D1 D0 move
.w D0 SP ) move Next end-code
Code >byte ( 16b -- 8bl 8bh )
SP )+ D0 move D0 D1 move $FF D0 andi 8 # D1 lsr
D0 SP -) move D1 SP -) move Next end-code
Transient definitions
: c@ H >image imagepage lc@ ;
: c! H >image imagepage lc! ;
: @ T dup c@ swap 1+ c@ byte> ;
: ! >r >byte r@ T c! r> 1+ c! ;
: cmove ( from.mem to.target quan -)
bounds ?DO dup H c@ I T c! H 1+ LOOP drop ;
\ *** Block No. 10 Hexblock A
\ Transient primitives bp05mar86we
: here there ;
: allot Tdp +! ;
: c, T here c! 1 allot H ;
: , T here ! 2 allot H ;
: ," Ascii " parse dup T c,
under there swap cmove
dup 1 and 0= IF 1+ THEN allot H ;
: fill ( addr quan 8b -)
-rot bounds ?DO dup I T c! H LOOP drop ;
: erase 0 T fill ;
: blank bl T fill ;
: here! H Tdp ! ;
\ *** Block No. 11 Hexblock B
\ Resolving 08dec85we
Forth definitions
: resolve ( cfa.ghost cfa.target -)
over dup @ <res> =
IF space dup >name .name ." exists " ?cr 2+ ! drop exit THEN
>r >r 2+ @ ?dup
IF BEGIN dup T @ H 2dup = abort" resolve loop" r@ rot T !
H ?dup 0= UNTIL
THEN r> r> <res> over ! 2+ ! ;
: resdoes> ( cfa.ghost cfa.target -)
swap gdoes> dup @ <res> = IF 2+ ! exit THEN swap resolve ;
] Does> [ here 4- 0 ] dup @ there rot ! T , H ;
' <forw> >body !
] Does> [ here 4- 0 ] @ T , H ;
' <res> >body !
\ *** Block No. 12 Hexblock C
\ move-threads 68000-align 13jun86we
: move-threads Tvoc @ Tvoc-link @
BEGIN over ?dup
WHILE 2- @ over 2- T ! @ H swap @ swap REPEAT
error" some undef. Target-Vocs left" drop ;
| : tlatest ( - addr) current @ 6 + ;
| : 68000-talign ( cfa -- ) 1 and IF 1 T allot H THEN ;
\ *** Block No. 13 Hexblock D
\ save-target 09sep86we
Dos definitions
Code (filewrite ( buff len handle -- n)
SP )+ D0 move .l D2 clr .w SP )+ D2 move
.l 0 imagepage # D1 move .w SP )+ D1 move
.l D1 A7 -) move \ buffer adress
.l D2 A7 -) move \ buffer length
.w D0 A7 -) move \ handle
$40 # A7 -) move \ call WRITE
1 trap $0C # A7 adda
.w D0 SP -) move Next end-code Forth definitions
\ *** Block No. 14 Hexblock E
\ save Target-System 09sep86we
: save-target [ Dos ]
bl word count dup 0= abort" missing filename"
over + off (createfile dup >r 0< abort" no device "
T here $1C - 4 ! 0 , 0 , H [ Dos ] \ Programm header
0 there r@ (filewrite there - abort" write error"
r> (closefile 0< abort" close error" ;
\ *** Block No. 15 Hexblock F
\ compiling names into targ. 05mar86we
: (theader
there 68000-talign
?thead @ IF 1 ?thead +! exit THEN
>in @ name swap >in !
dup c@ 1 $20 uwithin not
abort" inval. Tname"
blk @ T , H there tlatest dup @ T , H ! there dup tlast !
over c@ 1+ even dup T allot cmove H ;
: Theader tlast off
(theader Ghost dup glast' !
there resolve ;
\ *** Block No. 16 Hexblock 10
\ prebuild defining words bp27jun85we
| : executable? ( adr - adr f ) dup ;
| : tpfa, there , ;
| : (prebuild ( cfa.adr -- )
>in @ Create >in ! here 2- ! ;
: prebuild ( adr 0.from.: - 0 )
0 ?pairs executable? dup >r
IF [compile] Literal compile (prebuild ELSE drop THEN
compile Theader Ghost gdoes> ,
r> IF compile tpfa, THEN 0 ; immediate restrict
\ *** Block No. 17 Hexblock 11
\ code portion of def.words bp11sep86we
: dummy 0 ;
: DO> ( - adr.of.jmp.dodoes> 0 )
[compile] Does> here 4- compile @ 0 ] ;
\ *** Block No. 18 Hexblock 12
\ the 68000 Assembler 11sep86we
Forth definitions
| Create relocate ] T c, , c@ here allot ! c! H [
Transient definitions
: Assembler H [ Assembler ] relocate >codes ! Assembler ;
: >label ( 16b -) H >in @ name gfind rot >in !
IF over resolve dup THEN drop Constant ;
: Label T here 1 and allot here >label Assembler H ;
: Code H Theader there 2+ T , Assembler H ;
\ *** Block No. 19 Hexblock 13
\ immed. restr. ' \ compile bp05mar86we
: ?pairs ( n1 n2 -- ) H - abort" unstructured" ;
: >mark ( - addr ) H there T 0 , H ;
: >resolve ( addr - ) H there over - swap T ! H ;
: <mark ( - addr ) H there ;
: <resolve ( addr - ) H there - T , H ;
: immediate H Tlast @ ?dup
IF dup T c@ $40 or swap c! H THEN ;
: restrict H Tlast @ ?dup
IF dup T c@ $80 or swap c! H THEN ;
: ' ( <name> - cfa ) H g' dup @ <res> - abort" ?" 2+ @ ;
: | H ?thead @ ?exit ?thead on ;
: compile H Ghost , ; immediate restrict
\ *** Block No. 20 Hexblock 14
\ Target tools ks05mar86we
Onlyforth Ttools also definitions
| : ttype ( adr n -) bounds ?DO I T c@ H dup
bl > IF emit ELSE drop Ascii . emit THEN LOOP ;
: .name ( nfa -) ?dup IF dup 1+ swap T c@ H $1F and ttype
ELSE ." ??? " THEN space ?cr ;
| : nfa? ( cfa lfa - nfa / cfa ff)
BEGIN dup WHILE 2dup 2+ dup T c@ H $1F and + 1+ even =
IF 2+ nip exit THEN
T @ H REPEAT ;
: >name ( cfa - nfa / ff)
Tvoc BEGIN @ dup WHILE under 2- @ nfa? ?dup
IF nip exit THEN
swap REPEAT nip ;
\ *** Block No. 21 Hexblock 15
\ Ttools for decompiling ks05mar86we
| : ?: dup 4 u.r ." :" ;
| : @? dup T @ H 6 u.r ;
| : c? dup T c@ H 3 .r ;
: s ( addr - addr+ ) ?: space c? 3 spaces
dup 1+ over T c@ H ttype dup T c@ H + 1+ ;
: n ( addr - addr+2 ) ?: @? 2 spaces
dup T @ H [ Ttools ] >name .name H 2+ ;
: d ( addr n - addr+n ) 2dup swap ?: swap 0 DO c? 1+ LOOP
2 spaces -rot ttype ;
\ *** Block No. 22 Hexblock 16
\ Tools for decompiling bp05mar86we
: l ( addr -- addr+2 ) ?: 5 spaces @? 2+ ;
: c ( addr -- addr+1 ) 1 d ;
: b ( addr -- addr+1 ) ?: @? dup T @ H over + 5 u.r 2+ ;
: dump ( adr n -) bounds ?DO cr I $10 d drop
stop? IF LEAVE THEN $10 +LOOP ;
: view T ' H [ Ttools ] >name ?dup
IF 4- T @ H l THEN ;
\ *** Block No. 23 Hexblock 17
\ reinterpretation def.-words 05mar86we
Onlyforth
: redefinition
tdoes> @ IF >in push [ ' >interpret >body ] Literal push
state push context push >in: @ >in !
name [ ' Transient 2+ ] Literal (find nip 0=
IF cr ." Redefinition: " here .name
>in: @ >in ! : Defining interpret THEN
THEN 0 tdoes> ! ;
\ *** Block No. 24 Hexblock 18
\ Create..does> structure bp05mar86we
| : (;tcode Tlast @ dup T c@ dup 1 and - 2+ + ! H rdrop ;
| : changecfa compile lit tdoes> @ , compile (;tcode ;
Defining definitions
: ;code 0 ?pairs changecfa reveal rdrop ;
immediate restrict
Defining ' ;code Alias does> immediate restrict
: ; [compile] ; rdrop ; immediate restrict
\ *** Block No. 25 Hexblock 19
\ redefinition conditionals bp27jun85we
' DO Alias DO immediate restrict
' ?DO Alias ?DO immediate restrict
' LOOP Alias LOOP immediate restrict
' IF Alias IF immediate restrict
' THEN Alias THEN immediate restrict
' ELSE Alias ELSE immediate restrict
' BEGIN Alias BEGIN immediate restrict
' UNTIL Alias UNTIL immediate restrict
' WHILE Alias WHILE immediate restrict
' REPEAT Alias REPEAT immediate restrict
\ *** Block No. 26 Hexblock 1A
\ clear Liter. Ascii ['] ." bp05mar86we
Onlyforth Transient definitions
: clear true abort" There are ghosts" ;
: Literal ( n -) T compile lit , H ; immediate
: Ascii H bl word 1+ c@ state @
IF T [compile] Literal H THEN ; immediate
: ['] T ' [compile] Literal H ; immediate restrict
: " T compile (" ," H ; immediate restrict
: ." T compile (." ," H ; immediate restrict
\ *** Block No. 27 Hexblock 1B
\ Target compilation ] [ bp05mar86we
Forth definitions
: tcompile
?stack >in @ name find ?dup
IF 0> IF nip execute >interpret THEN
drop dup >in ! name
THEN gfind IF nip execute >interpret THEN
nullstring? IF drop exit THEN
number? ?dup IF 0> IF swap T [compile] Literal THEN
[compile] Literal H drop >interpret THEN
drop >in ! Word, >interpret ;
Transient definitions
: ] H state on ['] tcompile is >interpret ;
\ *** Block No. 28 Hexblock 1C
\ Target conditionals bp05mar86we
: IF T compile ?branch >mark H 1 ; immediate restrict
: THEN abs 1 T ?pairs >resolve H ; immediate restrict
: ELSE T 1 ?pairs compile branch >mark swap >resolve
H -1 ; immediate restrict
: BEGIN T <mark H 2 ; immediate restrict
: WHILE T 2 ?pairs 2 compile ?branch >mark -2 H 2swap ;
immediate restrict
| : (repeat T 2 ?pairs <resolve H BEGIN dup -2 =
WHILE drop T >resolve H REPEAT ;
: UNTIL T compile ?branch (repeat H ; immediate restrict
: REPEAT T compile branch (repeat H ; immediate restrict
\ *** Block No. 29 Hexblock 1D
\ Target conditionals bp27jun85we
: DO T compile (do >mark H 3 ; immediate restrict
: ?DO T compile (?do >mark H 3 ; immediate restrict
: LOOP T 3 ?pairs compile (loop compile endloop
>resolve H ; immediate restrict
: +LOOP T 3 ?pairs compile (+loop compile endloop
>resolve H ; immediate restrict
\ *** Block No. 30 Hexblock 1E
\ predefinitions bp05mar86we
: abort" T compile (abort" ," H ; immediate
: error" T compile (err" ," H ; immediate
Forth definitions
Variable torigin
Variable tudp 0 Tudp !
: >user T c@ H torigin @ + ;
\ *** Block No. 31 Hexblock 1F
\ Datatypes bp05mar86we
Transient definitions
: origin! H torigin ! ;
: user' ( -- n ) T ' >body c@ H ;
: uallot ( n -- ) H tudp @ swap tudp +! ;
DO> >user ;
: User prebuild User 2 T uallot c, ;
DO> ;
: Create prebuild Create ;
DO> T @ H ;
: Constant prebuild Constant T , ;
: Variable Create 2 T allot ;
\ *** Block No. 32 Hexblock 20
\ Datatypes bp05mar86we
dummy
: Vocabulary
H >in @ Vocabulary >in ! T prebuild Vocabulary 0 , 0 ,
here H tvoc-link @ T , H tvoc-link ! ;
\ *** Block No. 33 Hexblock 21
\ target defining words bp08sep86we
Do> ;
: Defer prebuild Defer 2 T allot ;
: Is T ' H >body state @ IF T compile (is , H
ELSE T ! H THEN ; immediate
| : dodoes> T compile (;code H Glast' @
there resdoes> there tdoes> ! ;
: ;code 0 T ?pairs dodoes> Assembler H [compile] [
redefinition ; immediate restrict
: does> T dodoes> $4EAB , \ FP D) JSR
compile (dodoes> H ; immediate restrict
\ *** Block No. 34 Hexblock 22
\ : Alias ; bp25mar86we
: Create: T Create H current @ context ! T ] H 0 ;
dummy
: : H tdoes> off >in @ >in: ! T prebuild :
H current @ context ! T ] H 0 ;
: Alias ( n -- ) H Tlast off (theader Ghost over resolve
tlast @ T c@ H $20 or tlast @ T c! , H ;
: ; T 0 ?pairs compile unnest [compile] [ H redefinition ;
immediate restrict
\ *** Block No. 35 Hexblock 23
\ predefinitions bp11sep86we
: compile T compile compile H ; immediate restrict
: Host H Onlyforth Ttools also ;
: Compiler T Host H Transient also definitions ;
: [compile] H Word, ; immediate restrict
: Onlypatch H there 4- 0 tdoes> ! 0 ;
Onlyforth
: Target Onlyforth Transient also definitions ;
Transient definitions
Ghost c, drop
\ *** Block No. 36 Hexblock 24
\ *** Block No. 37 Hexblock 25
\ *** Block No. 38 Hexblock 26
\ *** Block No. 39 Hexblock 27