;
;	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, CODE, READWRITE
        ENTRY
        ADR     r4, P
		ADR     r5, Q
        MOV     sp, #0
        MOV     fp, #0x0000C000
		LDR     r0, [r4]
		BL      Func1
		STR     r1, [r4]
		LDR     r0, [r5]
		BL      Func1
		STR     r1, [r5]
done    B       done
Func1   PUSH    {fp}
        CMP     r0, #0
        PUSHGT  {lr}
        PUSHGT  {r0}
		BLGT    Times16
        POPGT   {r1}
		POPGT   {lr}
        ADDGT   r1, r1, #1
        MOVLE   r1, r0, LSL #5
        POP     {fp}
		MOV     pc, lr
Times16 POP     {r7}
        MOV     r7, r7, LSL #4
        PUSH    {r7}
        MOV     pc, lr
        AREA  NESTED_SUBROUTINE_STACK, DATA, READWRITE
P       DCD   3
Q       DCD   -1
        END
