;
;	CPE 221 Assembly Example
;    
;   This example demonstrates nested subroutine call capability.
;	
;   int Func1 (int);
;   int Times16 (int);
;   int main()
;   {
;      int P = 3;
;      int Q = -1;
;      P = Func1(P);
;      Q = Func1(Q);
;   }
;   int Func1(int x)
;   {
;     if (x > 0) 
;       x = Times16(x) + 1;
;     else
;       x = 32*x;
;     return(x);
;   }
;   int Times16(int x)
;   {
;     x = 16*x;
;     return(x);
;   }

        AREA NESTED_SUBROUTINE_STACK_NO_BL, CODE, READONLY
        ENTRY
        ADR   r4, P
		ADR   r5, Q
		LDR   r0, [r4]
        SUB   sp, sp, #4
        STR   pc, [sp]
		BAL   Func1
		STR   r1, [r4]
		LDR   r0, [r5]
		SUB   sp, sp, #4
		STR   pc, [sp]
		BAL   Func1
		STR   r1, [r5]
done    BAL     done
Func1   CMP   r0, #0
        SUBGT sp, sp, #4
		STRGT pc, [sp]
		BLGT  Times16
        ADDGT r1, r1, #1
        MOVLE r1, r0, LSL #5
        LDR   r12, [sp], #4
        SUB   pc, r12, #4
Times16 MOV   r1, r0, LSL #4
        LDR   r12, [sp], #4
		SUB   pc, r12, #4
        AREA  NESTED_SUBROUTINE_STACK_NO_BL, DATA, READWRITE
P       DCD   3
Q       DCD   -1
        END
