diff -r 000000000000 -r fb772792efd1 AnnexF/stack_int_il.txt --- /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