|
The sample assembler code in Figure 1 demonstrates
the use of the Command Scan Service Routine to syntax
check a subcommand name. Suppose the command buffer passed to command
scan contains the following subcommand: SUBCMD OPERAND1 OPERAND2
When
IKJSCAN returns control, the offset field in the command buffer contains
the value 7, the number of bytes that precede OPERAND1 in the command
buffer.
Figure 1. An example
using the Command Scan Service RoutineSCANEX CSECT ,
SCANEX AMODE 31 COMMAND'S ADDRESSING MODE
SCANEX RMODE ANY COMMAND'S RESIDENCY MODE
SCANEX CSECT
STM R14,R12,12(R13) SAVE CALLER'S REGISTERS
LR R11,R15 ESTABLISH ADDRESSABILITY WITHIN
USING SCANEX,R11 THIS CSECT
LR R9,R1 SAVE THE POINTER TO THE CPPL
GETMAIN RU,LV=WORKSIZE OBTAIN A DYNAMIC WORK AREA
*
LR R10,R1
USING WORK_AREA,R10 ESTABLISH ADDRESSABILITY
ST R10,8(R13) PUT THE ADDRESS OF MY SAVE AREA
* INTO CALLER'S SAVE AREA
ST R13,4(R10) PUT THE ADDRESS OF MY SAVE AREA
* INTO MY SAVE AREA FOR CALLING
LR R13,R1 LOAD GETMAINED AREA ADDRESS
*
ST R9,CPPL_PTR
USING CPPL,R9 GET ADDRESSABILITY TO THE CPPL
*
LA R2,DYN_CSPL POINT TO MY CSPL
ST R2,CSPL_PTR SAVE CSPL POINTER
USING CSPL,R2 GET ADDRESSABILITY TO THE CSPL
MVC CSPLCBUF,CPPLCBUF GET THE ADDRESS OF THE COMMAND BUFFER
LA R4,OUT_AREA GET THE ADDRESS OF THE OUTPUT AREA
ST R4,CSPLOA AND STORE IT IN THE CSPL
MVC CSPLUPT,CPPLUPT MOVE IN THE UPT ADDRESS
MVC CSPLECT,CPPLECT MOVE IN THE ECT ADDRESS
LA R4,ECB GET THE ADDRESS OF THE ECB
ST R4,CSPLECB AND STORE IT IN THE CSPL
LA R4,FLAGWORD GET THE FLAGWORD ADDRESS
ST R4,CSPLFLG AND STORE IT IN THE CSPL
XC ECB,ECB SET THE ECB TO ZERO
*
CALLTSSR EP=IKJSCAN,MF=(E,CSPL) INVOKE IKJSCAN
*
ST R15,RETCODE SAVE THE RETURN CODE
*
*
* TEST THE RETURN CODE AND EXAMINE THE COMMAND SCAN OUTPUT AREA.
* PROCESS ACCORDINGLY.
* .
* .
* .
*
DROP R2
DROP R9
*
* PERFORM CLEANUP PROCESSING
*
*
L R5,RETCODE GET THE RETURN CODE
LR R1,R13 POINT TO THE WORK AREA
L R13,4(R13) CHAIN TO PREVIOUS SAVE AREA
FREEMAIN RU,LV=WORKSIZE,A=(1)
L R14,12(R13) HERE'S OUR RETURN ADDRESS
LR R15,R5 HERE'S THE RETURN CODE
LM R0,R12,20(R13) RESTORE REGS 0-12
BSM 0,14 RETURN TO INVOKER
*********************************************************************
* *
* DECLARES FOR DYNAMIC VARIABLES *
* *
*********************************************************************
WORK_AREA DSECT
SAVEAREA DS 0CL72 STANDARD SAVE AREA
DS F UNUSED
DS F BACKWARD SAVE AREA POINTER
DS F FORWARD SAVE AREA POINTER
REG14 DS F CONTENTS OF REGISTER 14
REG15 DS F CONTENTS OF REGISTER 15
REG0 DS F CONTENTS OF REGISTER 0
REG1 DS F CONTENTS OF REGISTER 1
REG2 DS F CONTENTS OF REGISTER 2
REG3 DS F CONTENTS OF REGISTER 3
REG4 DS F CONTENTS OF REGISTER 4
REG5 DS F CONTENTS OF REGISTER 5
REG6 DS F CONTENTS OF REGISTER 6
REG7 DS F CONTENTS OF REGISTER 7
REG8 DS F CONTENTS OF REGISTER 8
REG9 DS F CONTENTS OF REGISTER 9
REG10 DS F CONTENTS OF REGISTER 10
REG11 DS F CONTENTS OF REGISTER 11
REG12 DS F CONTENTS OF REGISTER 12
CPPL_PTR DS F ADDRESS OF THE CPPL
CSPL_PTR DS F ADDRESS OF THE CSPL
DYN_CSPL DS 6F STORAGE FOR THE CSPL
OUT_AREA DS 2F COMMAND SCAN OUTPUT AREA
FLAGWORD DS F FLAG WORD
ECB DS F ECB
RETCODE DS F RETURN CODE
WORKSIZE EQU *-WORK_AREA DESCRIBES LENGTH OF THE
* DYNAMIC WORK AREA
*
IKJCPPL COMMAND PROCESSOR PARAMETER LIST
LCPPL EQU *-CPPL DESCRIBES LENGTH OF THE CPPL
*
CVT DSECT=YES CVT NEEDED FOR CALLTSSR
IKJCSPL COMMAND SCAN PARAMETER LIST
IKJCSOA COMMAND SCAN OUTPUT AREA
*********************************************************************
* *
* REGISTER EQUATES *
* *
*********************************************************************
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
END SCANEX
|