diff -r 000000000000 -r fb772792efd1 AnnexF/stack_int_st.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/AnnexF/stack_int_st.txt Wed Jan 31 15:32:38 2007 +0100 @@ -0,0 +1,31 @@ +FUNCTION_BLOCK STACK_INT + VAR_INPUT PUSH, POP: BOOL R_EDGE; (* Basic stack operations *) + R1 : BOOL ; (* Over-riding reset *) + IN : INT ; (* Input to be pushed *) + N : INT ; (* Maximum depth after reset *) + END_VAR + VAR_OUTPUT EMPTY : BOOL := 1 ; (* Stack empty *) + OFLO : BOOL := 0 ; (* Stack overflow *) + OUT : INT := 0 ; (* Top of stack data *) + END_VAR + VAR STK : ARRAY[0..127] OF INT; (* Internal stack *) + NI : INT :=128 ; (* Storage for N upon reset *) + PTR : INT := -1 ; (* Stack pointer *) + END_VAR + (* Function Block body *) + IF R1 THEN + OFLO := 0; EMPTY := 1; PTR := -1; + NI := LIMIT (MN:=1,IN:=N,MX:=128); OUT := 0; + ELSIF POP & NOT EMPTY THEN + OFLO := 0; PTR := PTR-1; EMPTY := PTR < 0; + IF EMPTY THEN OUT := 0; + ELSE OUT := STK[PTR]; + END_IF ; + ELSIF PUSH & NOT OFLO THEN + EMPTY := 0; PTR := PTR+1; OFLO := (PTR = NI); + IF NOT OFLO THEN OUT := IN ; STK[PTR] := IN; + ELSE OUT := 0; + END_IF ; + END_IF ; + + END_FUNCTION_BLOCK