AnnexF/stack_int_il.txt
changeset 0 fb772792efd1
equal deleted inserted replaced
-1:000000000000 0:fb772792efd1
       
     1 FUNCTION_BLOCK STACK_INT
       
     2   VAR_INPUT PUSH, POP: BOOL R_EDGE; (* Basic stack operations *)
       
     3             R1 : BOOL ;          (* Over-riding reset *)
       
     4             IN : INT ;           (* Input to be pushed *)
       
     5             N  : INT ;           (* Maximum depth after reset *)
       
     6   END_VAR
       
     7   VAR_OUTPUT EMPTY : BOOL := 1 ;     (* Stack empty *)
       
     8              OFLO  : BOOL := 0 ;     (* Stack overflow *)
       
     9              OUT   : INT  := 0 ;     (* Top of stack data *)
       
    10   END_VAR
       
    11   VAR STK : ARRAY[0..127] OF INT; (* Internal stack *)
       
    12       NI : INT :=128  ;           (* Storage for N upon reset *)
       
    13       PTR : INT := -1 ;           (* Stack pointer *)
       
    14   END_VAR
       
    15     (* Function Block body *)
       
    16 	LD	R1	(* Dispatch on operations *)
       
    17 	JMPC	RESET	
       
    18 	LD	POP	
       
    19 	ANDN	EMPTY	(* Don't pop empty stack *)
       
    20 	JMPC	POP_STK	
       
    21 	LD	PUSH	
       
    22 	ANDN	OFLO	(* Don't push overflowed stack *)
       
    23 	JMPC	PUSH_STK	
       
    24 	RET		(* Return if no operations active *)
       
    25 RESET:	LD	0	(* Stack reset operations *)
       
    26 	ST	OFLO	
       
    27 	LD	1	
       
    28 	ST   	EMPTY	
       
    29 	LD	-1	
       
    30 	ST 	PTR	
       
    31 	CAL	LIMIT(MN:=1,IN:=N,MX:=128)
       
    32 	ST	NI	
       
    33 	JMP	ZRO_OUT	
       
    34 POP_STK:	LD	0	
       
    35 	ST	OFLO	(* Popped stack is not overflowing *)
       
    36 	LD	PTR	
       
    37 	SUB	1	
       
    38 	ST	PTR	
       
    39 	LT	0	(* Empty when PTR < 0 *)
       
    40 	ST	EMPTY	
       
    41 	JMPC	ZRO_OUT	
       
    42 	LD	STK[PTR]	
       
    43 	JMP	SET_OUT	
       
    44 PUSH_STK:	LD	0	
       
    45 	ST	EMPTY	(* Pushed stack is not empty *)
       
    46 	LD	PTR	
       
    47 	ADD	1	
       
    48 	ST	PTR	
       
    49 	EQ	NI	(* Overflow when PTR = NI *)
       
    50 	ST	OFLO	
       
    51 	JMPC	ZRO_OUT	
       
    52 	LD	IN	
       
    53 	ST	STK[PTR]	(* Push IN onto STK *)
       
    54 	JMP	SET_OUT	
       
    55 ZRO_OUT:	LD	0	(* OUT=0 for EMPTY or OFLO *)
       
    56 SET_OUT:	ST 	OUT	
       
    57 
       
    58   END_FUNCTION_BLOCK