: Stack ( size -<name>- )
create
dup
4 +
here
swap
allocate
if
drop 0
then
dup rot ! \ 紀錄 Stack空間位置
dup >R ! \ Stack第一個空間位置放 Stack_size
0 r> 4 + !
does>
;
: Stack.depth@ ( STACK_adr -- n )
@ 4 + @
;
: Stack.depth! ( n STACK_adr -- )
@ 4 + !
;
: Stack.free ( STACK_adr -- )
@ free
if
." free failed! "
else
." free ok!"
then
;
: >Stack ( n STACK_adr -- )
@ >r
r@ 4 + @ 1 + r@ 4 + !
r@ 4 + @ 4 * 4 + r> + !
;
: Stack> ( STACK_adr -- n )
@ >r
r@ 4 + @ 4 * 4 + r@ + @
r@ 4 + @ 1 - r> 4 + !
;
: Stack@ ( STACK_adr -- n )
@ >r
r@ 4 + @ 4 * 4 + r> + @
;
\ stack test
cr
100 Stack Stack_Name
\ 0 Stack_Name Stack.depth!
1 Stack_Name >Stack
Stack_Name Stack@ . cr
2 Stack_Name >Stack
Stack_Name Stack@ . cr
3 Stack_Name >Stack
Stack_Name Stack@ . cr
Stack_Name Stack> . cr
Stack_Name Stack> . cr
Stack_Name Stack> . cr
Stack_Name Stack.free
1
2
3
3
2
1
free ok! ok