AnnexF/stack_int_st.txt
changeset 0 fb772792efd1
--- /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