*---------------------------------------------------------------------*
*                                                                     *
*              Copyright (c) 1995, SAS Institute, Inc.                *
*                Unpublished - All Rights Reserved                    *
*                                                                     *
*                     S A S / C  S A M P L E                          *
*                                                                     *
*       Name: C2ASMA                                                  *
*                                                                     *
*   Language: Assembler                                               *
*                                                                     *
* EntryPoint: SUMINT                                                  *
*                                                                     *
* EntryType : C2ASMA expects to be called with a C framework          *
*             in place and standard OS Linkage VL-type parameter      *
*             list.  The parameter list is expected to be of          *
*             variable length, with at least one(1) argument,         *
*             all arguments are expected to be pointers to int.       *
*             The high-order bit of the last argument (a pointer)     *
*             is expected to be set on.                               *
*                                                                     *
* Files Note: 'prefix' is the installation defined high level         *
*             qualifier for the SAS/C product.                        *
*                                                                     *
*   Function: Sum the list of integers passed in the parameter list   *
*             and return the result in R15 to the caller.             *
*                                                                     *
*    Purpose: C#AMSA demonstrates assembler communications by using   *
*             CENTRY, CEXIT, CREGS, along with the CRAB and DSA.      *
*             It also shows how to process a VL-type parameter list,  *
*             such as the one produced by SAS/C __asm keyword, and    *
*             how to return a value to a caller via CEXIT.            *
*                                                                     *
*             C2ASMA is designed to be statically linked to a C       *
*             program and expects to be provided with a normal        *
*             C framework.                                            *
*                                                                     *
* Attributes: Re-entrant                                              *
*                                                                     *
* MVS - See prolog for prefix.SAMPLE.ASM(C2ASMC)                      *
*                                                                     *
* CMS - See prolog for SAMPLASM MACLIB(C2ASMC)                        *
*                                                                     *
* Misc Notes:                                                         *
*            - C2ASMA is not assembler dependent, use either          *
*              Assembler H or High Level Assembler.                   *
*                                                                     *
*---------------------------------------------------------------------*
         EJECT
         PRINT ON,GEN
SUMINT@  CSECT
         CREGS USING
         SPACE
SUMINT   CENTRY INDEP=NO,DSA=0
*---------------------------------------------------------------------*
* Make sure we actually got a plist address on the call.              *
*---------------------------------------------------------------------*
         SR    R3,R3              Clear R3 for sum'ing
         LTR   R1,R1              Is there a plist?
         BZ    DONE               Nope, just leave w/R3=0!
         SPACE
*---------------------------------------------------------------------*
* Sum integers passed via VL-Type parameter list.                     *
*---------------------------------------------------------------------*
         SR    R3,R3              Clear R3 for summing
NEXTADD  DS    0H
         L     R4,0(R1)           Load pointer
         A     R3,0(R4)           Add integer to sum
         TM    0(R1),X'80'        End of VL-Plist? <---Note This Check
         BNZ   DONE               Yes, finish up and exit
         LA    R1,4(R1)           No, bump to next argument
         B     NEXTADD            Start again
DONE     DS    0H                 Yes, prepare to return
         SPACE
*---------------------------------------------------------------------*
* Exit with the sum of the integers provided to CEXIT in R3.          *
*---------------------------------------------------------------------*
         CEXIT  RC=(R3),INDEP=NO,DSA=0
         EJECT
*---------------------------------------------------------------------*
* Constants                                                           *
*---------------------------------------------------------------------*
         LTORG                         Area for Literal Pool
*---------------------------------------------------------------------*
* Working Storage                                                     *
*---------------------------------------------------------------------*
         COPY  DSA                     Required for CENTRY/CEXIT
*---------------------------------------------------------------------*
* Dsects                                                              *
*---------------------------------------------------------------------*
         COPY  CRAB                    Required for CENTRY/CEXIT
         END   SUMINT