AnnexF/stack_int_il.txt
changeset 0 fb772792efd1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AnnexF/stack_int_il.txt	Wed Jan 31 15:32:38 2007 +0100
@@ -0,0 +1,58 @@
+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 *)
+	LD	R1	(* Dispatch on operations *)
+	JMPC	RESET	
+	LD	POP	
+	ANDN	EMPTY	(* Don't pop empty stack *)
+	JMPC	POP_STK	
+	LD	PUSH	
+	ANDN	OFLO	(* Don't push overflowed stack *)
+	JMPC	PUSH_STK	
+	RET		(* Return if no operations active *)
+RESET:	LD	0	(* Stack reset operations *)
+	ST	OFLO	
+	LD	1	
+	ST   	EMPTY	
+	LD	-1	
+	ST 	PTR	
+	CAL	LIMIT(MN:=1,IN:=N,MX:=128)
+	ST	NI	
+	JMP	ZRO_OUT	
+POP_STK:	LD	0	
+	ST	OFLO	(* Popped stack is not overflowing *)
+	LD	PTR	
+	SUB	1	
+	ST	PTR	
+	LT	0	(* Empty when PTR < 0 *)
+	ST	EMPTY	
+	JMPC	ZRO_OUT	
+	LD	STK[PTR]	
+	JMP	SET_OUT	
+PUSH_STK:	LD	0	
+	ST	EMPTY	(* Pushed stack is not empty *)
+	LD	PTR	
+	ADD	1	
+	ST	PTR	
+	EQ	NI	(* Overflow when PTR = NI *)
+	ST	OFLO	
+	JMPC	ZRO_OUT	
+	LD	IN	
+	ST	STK[PTR]	(* Push IN onto STK *)
+	JMP	SET_OUT	
+ZRO_OUT:	LD	0	(* OUT=0 for EMPTY or OFLO *)
+SET_OUT:	ST 	OUT	
+
+  END_FUNCTION_BLOCK