TITLE 'ALXEXCOM - PROGRAM TO PROCESS REXX VARIABLES' ******************************************************************** * AUTHOR - BILL SWEENEY * * SSC, INC. (703) 777-2771 * * WHSWEENEY@SSCMAINFRAME.COM * * WWW.SSCMAINFRAME.COM * * DATE - (C) COPYRIGHT NOVEMBER 1996 * * * * FUNCTION - PROGRAM IS INVOKED TO FETCH OR STORE REXX VARIABLES * * PASSED IN A PARAMETER LIST. TSO/E REXX PGM IRXEXCOM * * INVOKED TO PROCESS VARIABLE IN PARAMETER INFORMATION.* * * * REGISTER USAGE * * R1 - PARAMETER LIST ADDRESS * * R12 - FIRST BASE REGISTER * * R11 - ADDRESSABILITY TO DSECT * * R0-R10,R14-R15 - VARIOUS WORK REGISTER UTILIZATION * * * * LINKAGE ATTRIBUTES - AMODE 31, RMODE 24, REENTRANT * ******************************************************************** ALXEXCOM CSECT ALXEXCOM AMODE 31 ALXEXCOM RMODE ANY PRINT ON,GEN R0 EQU 0 R1 EQU 1 R2 EQU 2 R3 EQU 3 R4 EQU 4 R5 EQU 5 R6 EQU 6 R7 EQU 7 R8 EQU 8 R9 EQU 9 R10 EQU 10 R11 EQU 11 R12 EQU 12 R13 EQU 13 R14 EQU 14 R15 EQU 15 NO_STORAGE EQU 20 BAD_FUNCTION EQU 24 EJECT **************************************************************** * SAVE LOGIC AND ENTRY SETUP OF PROGRAM. * **************************************************************** STM R14,R12,12(R13) SAVE IN CALLERS SAVEAREA LR R12,R15 USING ALXEXCOM,R12 * LR R11,R1 LOAD UP THE PARAMETER LIST L R11,0(R1) LOAD UP THE PARAMETER LIST USING PARMLIST,R11 CLC FUNCTION(5),FETCH_KW VERIFY GOOD FUNCTION BE GOOD_FUNCTION YES, THEN GO AROUND CLC FUNCTION(5),STORE_KW VERIFY GOOD FUNCTION BE GOOD_FUNCTION YES, THEN GO AROUNT LA R15,BAD_FUNCTION LOAD UP PREDETERMINED RC B RETURN2 AND GET OUT GOOD_FUNCTION EQU * L R3,VARIABLE_COUNT GET THE COUNT SLL R3,5 MULTIPLY BY 32 FOR SHVBLOCK LA R2,STORAGE_SIZE GET THE SIZE OF OUR STORAGE AR R3,R2 TOTAL FOR GETMAIN GETMAIN RC,LV=(3) LTR R15,R15 SEE IF VALID GETMAIN BZ GOOD_STORAGE YES, THEN CONTINUE MACDUFF LA R15,NO_STORAGE LOAD UP PREDETERMINED RC B RETURN2 AND GET OUT GOOD_STORAGE EQU * ST R1,8(R13) SAVE OUR SAVERAREA ST R13,4(R1) SAVE THEIR SAVEAREA LR R13,R1 LOAD OURS USING STORAGE,R13 LA R10,0(R2,R13) ADDRESS TO THE SHVBLOCK ST R10,SHVBLOCK_ADDRESS SAVE THIS LOCATION USING SHVBLOCK,R10 LET R10 ADDRESS THE SHV BLOCKS ST R3,GETMAIN_LENGTH SAVE THIS FOR FREEMAIN ******************************************************************* * WE ARE NOW GOING TO LOOP THROUGH THE VARIABLE PARAMETER LIST, * * INITIALIZE THE SHVBLOCKS, LOAD THE IRXEXCOM PROGRAM AND THEN * * CALL IT, THE RETURN CODE WILL BE SAVED IN THE PARAMETER LIST * * FIELD AS WELL AS IN REGISTER 15. * ******************************************************************* LA R4,VARIABLE_FIELDS GET THIS LOCATION FOR 1ST VARIABLE L R3,VARIABLE_COUNT RELOAD THE COUNT LOOPINIT XC 0(32,R10),0(R10) MAKE SURE THE 32 BYTES ARE ZERO MVC SHVCODE(1),FUNCTION MOVE IN F FOR FETCH OR S FOR STORE ICM R15,15,0(R4) MOVE IN VARIABLE NAME LENGTH STCM R15,15,SHVNAML SAVE THE LENGTH LA R5,4(R4) GET THE ADDRESS OF VARIABLE NAME ST R5,SHVNAMA MOVE IN ADDRESS OF VARIABLE NAME LA R4,4(R4,R15) INCREMENT PAST VARIABLE NAME ICM R15,15,0(R4) MOVE IN VARIABLE NAME LENGTH STCM R15,15,SHVVALL SAVE THE LENGTH OF VARIABLE DATA LA R5,4(R4) GET THE ADDRESS OF VARIABLE DATA ST R5,SHVVALA MOVE IN ADDRESS OF VARIABLE DATA CLI SHVCODE,SHVFETCH SEE IF FETCH BNE ITSSTORE NO, THEN DO NOT UPDATE BUFFER STCM R15,15,SHVBUFL SAVE THE LENGTH OF VARIABLE DATA * I MOVED ITSSTORE UP ONE LINE ITSSTORE LA R4,4(R4,R15) INCREMENT PAST VARIABLE NAME CH R3,HW1 IS THIS THE LAST TIME THROUGH BE FALL_THROUGH YES, THEN JUST GET OUT LA R15,32(R10) INCREMENT TO NEXT SHV ST R15,SHVNEXT SAVE THIS LOCATION IN CURRENT LR R10,R15 AND UPDATE TO NEXT SHV BLOCK BCT R3,LOOPINIT LOOP THROUGH UNTIL DONE FALL_THROUGH EQU * GET LOCATION POINTER L R10,SHVBLOCK_ADDRESS RELOAD REGISTER 10 TO INIT LOAD EP=IRXEXCOM LR R15,R0 SLR R0,R0 MVC CALLSTOR(CALLLEN),CALLXCOM CALL (15),(REXXPGM,PARM2,PARM2,(10)),VL,MF=(E,CALLSTOR) ST R15,RETURN_CODE LR R5,R15 SAVE THIS FOR LATER RELOAD CLC FUNCTION(5),FETCH_KW SEE IF THIS WAS A FETCH REQUEST BNE FREESTOR NO, THEN FINISH UP AND GO HOME ******************************************************************* * IF THIS WAS A FETCH FUNCTION THEN WE HAVE TO LOOP BACK THRU * * AND UPDATE THE LENGTH FIELDS FOR THE FETCHED VARIABLES. THE * * FIRST TWO BYTES OF THE VARIABLE DATA LENGTH FIELD WILL BE * * USED TO STORE THE LENGTHS RETURNED FROM IRXEXCOM. * ******************************************************************* LA R4,VARIABLE_FIELDS GET THIS LOCATION FOR 1ST VARIABLE L R3,VARIABLE_COUNT RELOAD THE COUNT L R10,SHVBLOCK_ADDRESS RELOAD REGISTER 10 TO INIT LOOP_FETCH EQU * ICM R15,15,0(R4) MOVE IN VARIABLE NAME LENGTH LA R4,4(R4,R15) INCREMENT PAST VARIABLE NAME ICM R15,15,0(R4) LOAD THE LENGTH FOR INCREMENT L R14,SHVVALL LOAD THE LENGTH OF VARIABLE READ STCM R14,3,0(R4) SAVE THE VARIABLE NAME LENGTH LA R4,4(R4,R15) INCREMENT PAST VARIABLE NAME LA R10,32(R10) INCREMENT TO NEXT SHV BCT R3,LOOP_FETCH LOOP THROUGH UNTIL DONE ** ******************************************* * LET'S FINISH IT UP AND GO HOME BOYS * ******************************************* FREESTOR EQU * L R0,GETMAIN_LENGTH LR R1,R13 L R13,4(R13) SO WE CAN GET OUT OF HERE FREEMAIN RC,A=(1),LV=(0) RETURN1 LR R15,R5 RETURN2 L R14,12(R13) LM R0,R12,20(R13) BR R14 REXXPGM DC CL8'IRXEXCOM' PARM2 DC F'0' HW1 DC H'1' FETCH_KW DC CL8'FETCH ' STORE_KW DC CL8'STORE ' CALLXCOM CALL ,(*,*,*,*),VL,MF=L CALLLEN EQU *-CALLXCOM LTORG STORAGE DSECT SAVEAREA DS 18F SHVBLOCK_ADDRESS DS F GETMAIN_LENGTH DS F CALLSTOR CALL ,(*,*,*,*),VL,MF=L ** STORAGE_SIZE EQU *-SAVEAREA * PARMLIST DSECT FUNCTION DS CL8 VARIABLE_COUNT DS F RETURN_CODE DS F * THIS PORTION WILL ADDRESS ALL VARIABLES WITH THE PROPER VALUES VARIABLE_FIELDS DS F IRXSHVB END