| cell% 2* field stack-pointer \ stackpointer name |
cell% 2* field stack-pointer \ stackpointer name |
| cell% field stack-type \ name for default type of stack items |
cell% field stack-type \ name for default type of stack items |
| cell% field stack-in-index-xt \ ( in-size item -- in-index ) |
cell% field stack-in-index-xt \ ( in-size item -- in-index ) |
| |
cell% field stack-access-transform \ ( nitem -- index ) |
| end-struct stack% |
end-struct stack% |
| |
|
| struct% |
struct% |
| 1 next-stack-number +! |
1 next-stack-number +! |
| r@ stack-type ! |
r@ stack-type ! |
| save-mem r@ stack-pointer 2! |
save-mem r@ stack-pointer 2! |
| ['] stack-in-index r> stack-in-index-xt ! ; |
['] stack-in-index r@ stack-in-index-xt ! |
| |
['] noop r@ stack-access-transform ! |
| |
rdrop ; |
| |
|
| : map-stacks { xt -- } |
: map-stacks { xt -- } |
| \ perform xt for all stacks |
\ perform xt for all stacks |
| |
|
| \ stack access stuff |
\ stack access stuff |
| |
|
| : normal-stack-access1 ( n stack -- ) |
: normal-stack-access0 { n stack -- } |
| stack-pointer 2@ type |
n stack stack-access-transform @ execute ." [" 0 .r ." ]" ; |
| dup |
|
| if |
: normal-stack-access1 { n stack -- } |
| ." [" 0 .r ." ]" |
stack stack-pointer 2@ type |
| |
n if |
| |
n stack normal-stack-access0 |
| else |
else |
| drop ." TOS" |
." TOS" |
| endif ; |
endif ; |
| |
|
| : normal-stack-access ( n stack -- ) |
: normal-stack-access ( n stack -- ) |
| stack stack-out @ 0<> stack stack-in @ 0= and |
stack stack-out @ 0<> stack stack-in @ 0= and |
| if |
if |
| ." IF_" stack stack-pointer 2@ 2dup type ." TOS(" |
." IF_" stack stack-pointer 2@ 2dup type ." TOS(" |
| 2dup type ." [0] = " type ." TOS);" cr |
2dup type 0 stack normal-stack-access0 ." = " type ." TOS);" cr |
| endif ; |
endif ; |
| |
|
| : flush-tos ( -- ) |
: flush-tos ( -- ) |
| stack stack-out @ 0= stack stack-in @ 0<> and |
stack stack-out @ 0= stack stack-in @ 0<> and |
| if |
if |
| ." IF_" stack stack-pointer 2@ 2dup type ." TOS(" |
." IF_" stack stack-pointer 2@ 2dup type ." TOS(" |
| 2dup type ." TOS = " type ." [0]);" cr |
2dup type ." TOS = " type 0 stack normal-stack-access0 ." );" cr |
| endif ; |
endif ; |
| |
|
| : fill-tos ( -- ) |
: fill-tos ( -- ) |
| : fetches ( -- ) |
: fetches ( -- ) |
| prim prim-effect-in prim prim-effect-in-end @ ['] fetch map-items ; |
prim prim-effect-in prim prim-effect-in-end @ ['] fetch map-items ; |
| |
|
| |
: stack-update-transform ( n1 stack -- n2 ) |
| |
\ n2 is the number by which the stack pointer should be |
| |
\ incremented to pop n1 items |
| |
stack-access-transform @ dup >r execute |
| |
0 r> execute - ; |
| |
|
| : stack-pointer-update { stack -- } |
: stack-pointer-update { stack -- } |
| \ stack grow downwards |
\ stacks grow downwards |
| stack stack-diff |
stack stack-diff |
| ?dup-if \ this check is not necessary, gcc would do this for us |
?dup-if \ this check is not necessary, gcc would do this for us |
| stack inst-stream = if |
stack inst-stream = if |
| ." INC_IP(" 0 .r ." );" cr |
." INC_IP(" 0 .r ." );" cr |
| else |
else |
| stack stack-pointer 2@ type ." += " 0 .r ." ;" cr |
stack stack-pointer 2@ type ." += " |
| |
stack stack-update-transform 0 .r ." ;" cr |
| endif |
endif |
| endif ; |
endif ; |
| |
|
| endif |
endif |
| 2drop ; |
2drop ; |
| |
|
| |
: output-nextp2 ( -- ) |
| |
." NEXT_P2;" cr ; |
| |
|
| |
variable tail-nextp2 \ xt to execute for printing NEXT_P2 in INST_TAIL |
| |
' output-nextp2 tail-nextp2 ! |
| |
|
| : output-label2 ( -- ) |
: output-label2 ( -- ) |
| ." LABEL2(" prim prim-c-name 2@ type ." )" cr |
." LABEL2(" prim prim-c-name 2@ type ." )" cr |
| ." NEXT_P2;" cr ; |
." NEXT_P2;" cr ; |
| xt execute ; |
xt execute ; |
| |
|
| : output-c-tail ( -- ) |
: output-c-tail ( -- ) |
| ['] noop output-c-tail1 ; |
tail-nextp2 @ output-c-tail1 ; |
| |
|
| : output-c-tail2 ( -- ) |
: output-c-tail2 ( -- ) |
| ['] output-label2 output-c-tail1 ; |
['] output-label2 output-c-tail1 ; |
| |
|
| : output-c-tail-no-stores ( -- ) |
: output-c-tail-no-stores ( -- ) |
| ['] noop output-c-tail1-no-stores ; |
tail-nextp2 @ output-c-tail1-no-stores ; |
| |
|
| : output-c-tail2-no-stores ( -- ) |
: output-c-tail2-no-stores ( -- ) |
| ['] output-label2 output-c-tail1-no-stores ; |
['] output-label2 output-c-tail1-no-stores ; |
| : output-alias ( -- ) |
: output-alias ( -- ) |
| ( primitive-number @ . ." alias " ) ." Primitive " prim prim-name 2@ type cr ; |
( primitive-number @ . ." alias " ) ." Primitive " prim prim-name 2@ type cr ; |
| |
|
| : output-prim-num ( -- ) |
: output-c-prim-num ( -- ) |
| prim prim-num @ 8 + 4 .r space prim prim-name 2@ type cr ; |
." #define N_" prim prim-c-name 2@ type prim prim-num @ 8 + 4 .r cr ; |
| |
|
| : output-forth ( -- ) |
: output-forth ( -- ) |
| prim prim-forth-code @ 0= |
prim prim-forth-code @ 0= |
| r> in-part ! ; |
r> in-part ! ; |
| |
|
| : part-stack-pointer-updates ( -- ) |
: part-stack-pointer-updates ( -- ) |
| max-stacks 0 +do |
next-stack-number @ 0 +do |
| i part-num @ 1+ s-c-max-depth @ dup |
i part-num @ 1+ s-c-max-depth @ dup |
| i num-combined @ s-c-max-depth @ = \ final depth |
i num-combined @ s-c-max-depth @ = \ final depth |
| swap i part-num @ s-c-max-depth @ <> \ just reached now |
swap i part-num @ s-c-max-depth @ <> \ just reached now |
| (( (( ` g || ` G )) {{ start }} nonl ** |
(( (( ` g || ` G )) {{ start }} nonl ** |
| {{ end |
{{ end |
| forth-flag @ IF ." group " type cr THEN |
forth-flag @ IF ." group " type cr THEN |
| c-flag @ IF ." GROUP(" type ." )" cr THEN }} |
c-flag @ IF ." GROUP(" type ." , " function-number @ 0 .r ." )" cr THEN }} |
| )) <- group-comment |
)) <- group-comment |
| |
|
| (( (( eval-comment || forth-comment || c-comment || else-comment || if-comment || group-comment )) ?? nonl ** )) <- comment-body |
(( (( eval-comment || forth-comment || c-comment || else-comment || if-comment || group-comment )) ?? nonl ** )) <- comment-body |