Previous Topic: Macros for Input ModulesNext Topic: Output Modules for Mapout Operations


Sample Input Module

What the Sample Input Module does

The following sample edit module verifies dates supplied by the terminal operator and, if necessary, strips out slashes to make the operator's input conform to mmddyy format. The sample edit module verifies that the date conforms to the following rules:

If the Date is in Error

If the sample edit module determines that the date is valid, the date is transposed from mmddyy to yymmdd format for storage. If the date is in error, an error indicator is sent to the map. The erroneous date appears on the map as ?00000 if the map is redisplayed to the user for correction.

The following sample edit module is not reentrant.

The #MOPT macro that is included in this sample module generates register equates for use in coding the module, sets up a CSECT name for the module, and includes the name of the macro and its date/time stamp in future listings of the module. Use of the #MOPT macro is optional.

Edit modules can be either SYSTEM or USER MODE programs; the majority are USER MODE. To specify a user-written edit module mode, use the #MOPT macro. Set the ENV parameter to USER for the USER MODE program or to SYS or SYSTEM for SYSTEM MODE. If you do not set the ENV parameter, the defaults imply that it is set to USER.

If a DC request is issued, USER MODE programs need to be link edited with IDMSBALI or need to issue a #BALI macro within the user-written edit module. If a DC request is not issued in the program, there is no need to link edit the program with IDMSBALI or to issue a #BALI macro within the code.

You don't need to link edit SYSTEM MODE edit modules with IDMSBALI or have the program contact the #BALI macro. However, the CSA DSECT must be copied into your code if you issue any DC request. If you issue a DC request, R9 and R10 must point to the TCE and CSA at the time of the request.

         COPY  #CSADS                                                   00000100
         COPY  #MRBDS                                                   00000200
         #MOPT CSECT=CSYPDTE0,ENV=SYS                                   00000300
DTE0NTRY #START MPMODE=ANY                                              00000400
**********************************************************************  00000500
*  R1 POINTS TO AN TEN WORD PARAMETER LIST FOR MAPIN AS FOLLOWS:     *  00000600
*                                                                    *  00000700
*  WORD1   0(R1) ───► ADDRESS OF DATA FIELD IN TARGET DATA RECORD    *  00000800
*  WORD2   4(R1) ───► ADDRESS OF HEADER FOR NEXT INPUT BUFFER        *  00000900
*  WORD3   8(R1) ───► ADDRESS OF END OF CURRENT INPUT BUFFER         *  00001000
*  WORD4  12(R1) ───► ADDRESS OF START OF INPUT DATA FOR FIELD       *  00001100
*  WORD5  16(R1) ───► ADDRESS OF MRE                                 *  00001200
*  WORD6  20(R1) ───► ADDRESS OF MCE                                 *  00001300
*  WORD7  24(R1) ───► ADDRESS OF PTE                                 *  00001400
*  WORD8  28(R1) ───► ADDRESS OF MRB                                 *  00001500
*  WORD9  32(R1) ───► ADDRESS OF START OF DATA IN THE WORK AREA      *  00001600
*  WORD10 36(R1) ───► ADDRESS OF LAST BYTE OF DATA IN THE WORK AREA  *  00001700
**********************************************************************  00001800
         L     R2,0(R1)            GET ADDRESS OF DATA FIELD            00001900
         L     R3,32(R1)           GET ADDRESS OF INPUT FIELD           00002000
         L     R4,16(R1)           GET ADDRESS OF MAP REQUEST ELMT      00002100
         USING CSA,R10             BASES DC CSA STORAGE                 00002200
         USING MRE,R4              BASES MAPPING MRE BLOCK              00002300
         LH    R6,MREINLEN         R6 <- LENGTH OF INPUT FIELD          00002400
CHKLEN8  LA    R5,8                R5 <- 8                              00002500
         CR    R5,R6               LENGTH=8?                            00002600
         BNE   CHKLEN6             NO, CHECK FOR LENGTH=6               00002700
         CLI   2(R3),C'/'          FORMAT OF XX/.....?                  00002800
         BNE   SETERROR            NO, SET INPUT ERROR                  00002900
         CLI   5(R3),C'/'          FORMAT OF XX/XX/..?                  00003000
         BNE   SETERROR            NO, SET INPUT ERROR                  00003100
         MVC   2(2,R3),3(R3)       MOVE DAYS OVER                       00003200
         MVC   4(2,R3),6(R3)       MOVE YEAR OVER                       00003300
         B     CHKNUMS             GO CHECK FOR NUMERIC CHARACTERS      00003400
CHKLEN6  LA    R5,6                R5 <- 6                              00003500
         CR    R5,R6               LENGTH=6?                            00003600
         BNE   SETERROR            NO, SET INPUT ERROR                  00003700
CHKNUMS  LR    R7,R3               R7 ─► FIRST CHARACTER OF DATE        00003800
         LA    R8,6(,R7)           R8 ─► FIRST CHARACTER PAST DATE      00003900
CHKNLOOP CLI   0(R7),C'0'          CHARACTER LOWER THAN 'F0'?           00004000
         BL    SETERROR            YES, SET INPUT ERROR                 00004100
         CLI   0(R7),C'9'          CHARACTER HIGHER THAN X'F9'?         00004200
         BH    SETERROR            YES, SET INPUT ERROR                 00004300
         LA    R7,1(,R7)           INCREMENT CHARACTER POINTER          00004400
         CR    R7,R8               END OF DATE?                         00004500
         BL    CHKNLOOP            NO, CHECK NEXT DATE CHARACTER        00004600
         CLC   0(6,R3),=C'000000'  IS DATE ZERO?                        00004700
         BE    FLIPDATE            YES, MOVE DATE TO USER RECORD        00004800
         CLC   0(6,R3),=C'999999'  IS DATE ALL NINES?                   00004900
         BE    FLIPDATE            YES, MOVE DATE TO USER RECORD        00005000
         CLC   0(2,R3),=C'12'      MONTH > 12?                          00005100
         BH    SETERROR                                                 00005200
         CLC   0(2,R3),=C'00'      MONTH = 0?                           00005300
         BE    SETERROR                                                 00005400
         CLC   2(2,R3),=C'00'      DAY = 0?                             00005500
         BE    SETERROR                                                 00005600
         CLC   4(2,R3),=C'00'      YEAR = 0?                            00005700
         BE    SETERROR                                                 00005800
         CLC   0(2,R3),=C'04'      APRIL?                               00005900
         BE    CHK30DAY                                                 00006000
         CLC   0(2,R3),=C'06'      JUNE?                                00006100
         BE    CHK30DAY                                                 00006200
         CLC   0(2,R3),=C'09'      SEPTEMBER?                           00006300
         BE    CHK30DAY                                                 00006400
         CLC   0(2,R3),=C'11'      NOVEMBER?                            00006500
         BE    CHK30DAY                                                 00006600
         CLC   0(2,R3),=C'02'      FEBRUARY?                            00006700
         BE    CHKLEAP             YES, CHECK FOR LEAP YEAR             00006800
         CLC   2(2,R3),=C'31'      31 DAYS OR FEWER FOR OTHER MONTHS    00006900
         BH    SETERROR            IF BAD, SET INPUT ERROR              00007000
         B     FLIPDATE            MOVE DATE TO USER RECORD             00007100
CHK30DAY CLC   2(2,R3),=C'30'      30 DAYS OR FEWER FOR SOME MONTHS     00007200
         BH    SETERROR            IF BAD, SET INPUT ERROR              00007300
         B     FLIPDATE            MOVE DATE TO USER RECORD             00007400
CHKLEAP  #GETSTK =(2)              GET 2 WORDS OF STORAGE (R11 BASED)   00007500
         PACK  0(8,R11),4(2,R3)    PACK THE YEAR                        00007600
         CVB   R9,0(,R11)          R9 <- CONVERTED BINARY YEAR          00007700
         SR    R8,R8               R8 <- ZERO                           00007800
         LA    R15,4               R15 <- 4                             00007900
         DR    R8,R15              DIVIDE YEAR BY 4                     00008000
         LTR   R8,R8               ZERO REMAINDER?                      00008100
         BZ    CHK29DAY            YES, CHECK FOR 29 OR FEWER DAYS      00008200
         CLC   2(2,R3),=C'28'      28 DAYS OR FEWER FOR NON-LEAP YEAR   00008300
         BH    SETERROR            IF BAD, SET INPUT ERROR              00008400
         B     FLIPDATE            MOVE DATE TO USER RECORD             00008500
CHK29DAY CLC   2(2,R3),=C'29'      29 DAYS OR FEWER FOR LEAP YEAR       00008600
         BH    SETERROR            IF BAD, SET INPUT ERROR              00008700
FLIPDATE MVC   0(2,R2),4(R3)       MOVE YEAR TO USER RECORD             00008800
         MVC   2(4,R2),0(R3)       MOVE MONTH AND DAY TO USER RECORD    00008900
         B     RETURN              RETURN                               00009000
SETERROR #SET  MRETERR             INDICATE INPUT ERROR TO USER         00009600
RETURN   #RTN                                                           00009200
         END   DTE0NTRY                                                 00009300