TITLE  'ICATS MAINLINE'                                        ICA00010
*********************************************************************** ICA00020
*                                                                     * ICA00030
*  MODULE NAME =  ICATS MAINLINE SUPERVISOR/DISPATCHER                * ICA00040
*                                                                     * ICA00050
*  FUNCTION =  RUN THE ICATS VIRTUAL MACHINE.                         * ICA00060
*                                                                     * ICA00070
*  ENTRY POINTS =  ICATS                                              * ICA00080
*                                                                     * ICA00090
*  LINKAGE =  BALR R14,R15 FROM CMS.  THIS IS THE MODULE THAT         * ICA00100
*             GETS CONTROL WHEN THIS PROGRAM IS FIRST STARTED.        * ICA00110
*                                                                     * ICA00120
*  REGISTER CONTENTS UPON ENTRY =                                     * ICA00130
*      R1  = POINTS TO THE PARAMETER LIST (NOT USED)                  * ICA00140
*      R14 = RETURN ADDRESS BACK TO CMS                               * ICA00150
*      R15 = ENTRY POINT TO THIS MODULE                               * ICA00160
*                                                                     * ICA00170
*  REGISTER USAGE =                                                   * ICA00180
*      R0  = USED TO PASS PARAMETERS TO SOME SUBROUTINES.             * ICA00190
*      R1  = USED TO PASS PARAMETERS TO SUBROUTINES.                  * ICA00200
*      R2  = USED TO ADDRESS THE ICATS COMMON DATA AREA.              * ICA00210
*      R3  = USED TO ADDRESS THE TERMINAL CONTROL BLOCKS.             * ICA00220
*      R4  = USED TO ADDRESS THE UTS CONTROL BLOCKS.                  * ICA00230
*      R5  = USED TO ADDRESS THE USER CONTROL BLOCKS.                 * ICA00240
*      R6  = USED TO ADDRESS THE DISK CONTROL BLOCKS.                 * ICA00250
*      R7  = MOSTLY FREE, BUT USED TO ADDRESS THE SMSG BUFFER QUEUE.  * ICA00260
*   R8-R10 = FREE                                                     * ICA00270
*      R11 = BASE REGISTER.                                           * ICA00280
*  R12-R13 = FREE                                                     * ICA00290
*      R14 = MY RETURN ADDRESS WHEN I CALL SOMEBODY                   * ICA00300
*      R15 = SUBROUTINE ADDRESS                                       * ICA00310
*                                                                     * ICA00320
*  LOW CORE USAGE   (BECAUSE OF THIS LOW CORE USAGE, THIS PROGRAM     * ICA00330
*                    TEMPORARILY CHANGES THE VIRTUAL STORAGE          * ICA00340
*                    PROTECT KEY TO 0 TO AVOID PROGRAM EXCEPTIONS,    * ICA00350
*                    BUT IMMEDIATELY RESTORES IT)                     * ICA00360
*      1)  SAVES AND RESTORES LBENT IN NUCON (THE COUNT OF LOADER     * ICA00370
*          TABLE ENTRIES IN HIGH STORAGE) WHEN LOADING IN A           * ICA00380
*          NON-RESIDENT COMMAND PROCESSING ROUTINE.  REPLACED         * ICA00390
*          AFTER THE COMMAND ROUTINE COMPLETES.                       * ICA00400
*                                                                     * ICA00410
*  MODULE LOGIC =                                                     * ICA00420
*      I)  INITIALIZE                                                 * ICA00430
*          1)  SET UP TO HANDLE SMSGS                                 * ICA00440
*              A)  SET UP TO HANDLE EXTERNAL INTERRUPTS               * ICA00450
*              B)  SET LOW ORDER BIT OF CONTROL REGISTER 0 TO 1       * ICA00460
*              C)  AUTHORIZE MYSELF BY ISSUING DIAGNOSE X'68'         * ICA00470
*          2)  DETERMINE THE USER ID OF THIS VIRTUAL MACHINE          * ICA00480
*              AND THE NODE ID OF THIS VM SYSTEM.                     * ICA00490
*      II)  READ THE CONFIGURATION FILE AND CONFIGURE.                * ICA00500
*      III)  TRY TO VARY ON AND ATTACH ALL THE UTS MACHINES TO ME.    * ICA00510
*      IV)  CALL THE DISPATCHER TO START DOING SOME WORK.             * ICA00520
*           (DON'T LEAVE THIS LOOP UNTIL WE QUIT)                     * ICA00530
*          1)  DISABLE ALL INTERRUPTS SO THAT NEW REQUESTS WON'T      * ICA00540
*              COME IN AFTER WE'VE CHECKED FOR THEM AND BEFORE        * ICA00550
*              THE WAIT STATE IN STEP 6).                             * ICA00560
*          2)  CHECK FOR ANY STACKED COMMANDS FROM THE CONSOLE.       * ICA00570
*              IF ANY, GO READ THEM AND PROCESS THE REQUEST.          * ICA00580
*          3)  CHECK FOR INTERRUPTS RECEIVED FROM ANY OF THE          * ICA00590
*              REMOTE, DIALED CONSOLES WE'RE SUPPORTING.              * ICA00600
*              IF ANY HAVE, PROCESS THAT INTERRUPT.                   * ICA00610
*          4)  CHECK FOR ANY SMSG'S THAT HAVE COME IN.  IF ANY        * ICA00620
*              HAVE, GO PROCESS THE SMSG REQUEST.                     * ICA00630
*          5)  CHECK FOR ANY UTS ATTENTION INTERRUPTS.                * ICA00640
*              IF SO, GO READ REQUEST CONTROL BLOCK AND               * ICA00650
*              PROCESS THE REQUEST.                                   * ICA00660
*          6)  IF NONE OF THE ABOVE, THEN GO INTO A WAIT STATE.       * ICA00670
*              A)  LOAD AN ENABLED WAIT STATE POINTING TO THE         * ICA00680
*                  TOP OF THIS DISPATCH ROUTINE.  WAIT FOR            * ICA00690
*                  SOMETHING TO HAPPEN.  CMS WILL TURN OFF THE        * ICA00700
*                  WAIT BIT IN THIS PSW WHEN AN I/O INTERRUPT         * ICA00710
*                  COMES IN.  MY EXTERNAL INTERRUPT ROUTINE WILL      * ICA00720
*                  TURN IT OFF IF AN SMSG COMES IN.                   * ICA00730
*      V)  SHUTDOWN                                                   * ICA00740
*          1)  QUIT HANDLING EXTERNAL INTERRUPTS.                     * ICA00750
*          2)  SET LOW ORDER BIT OF CONTROL REGISTER 0 TO 0.          * ICA00760
*          3)  UNAUTHORIZE MYSELF BY ISSUING DIAGNOSE X'68'.          * ICA00770
*          4)  RETURN TO CMS WITH A RETURN CODE OF ZERO.              * ICA00780
*                                                                     * ICA00790
*  NORMAL EXIT =                                                      * ICA00800
*      R15 = 0                                                        * ICA00810
*                                                                     * ICA00820
*  EXTERNAL REFERENCES = ICATEXIH, QUIT, STATUS, TRACE, TEST, FAKIT,  * ICA00830
*                        IGNORCMD, CAT, READ, WRITE, TIME, RESTART,   * ICA00840
*                        TERMIO, CONFIG, ATTACH, DOTERM, READRCB,     * ICA00850
*                        READUTS, WRITEUTS, INTERUTS, DOTERMIO,       * ICA00860
*                        MESSAGE, ACCESS, ETTE, PARSE, CONHEX,        * ICA00870
*                        CONEHEX, CONDEC, REJECT.                     * ICA00880
*                                                                     * ICA00890
* CONTROL BLOCKS =  ICDATA    ICATS COMMON DATA AREA                  * ICA00900
*                   UTSCB     UTS MACHINE CONTROL BLOCK               * ICA00910
*                   USERCB    USER FOR THIS UTS CONTROL BLOCK         * ICA00920
*                   DISKCB    DISK FOR THIS USER CONTROL BLOCK        * ICA00930
*                   TERMCB    DIAL-ABLE TERMINALS CONTROL BLOCK       * ICA00940
*                                                                     * ICA00950
*                                                                     * ICA00960
*  NON-STANDARD MACROS (FOUND IN ICATS MACLIB)                        * ICA00970
*            ICDATA = ICATS COMMON DATA AREA DSECT.                   * ICA00980
*            ETTE   = ENTER TRACE TABLE ENTRY SUBROUTINE              * ICA00990
*                                                                     * ICA01000
*  CHANGE ACTIVITY                                                    * ICA01010
*    DATE        NAME       REASON FOR CHANGE                         * ICA01020
*  01/17/83  RICK JASPER    INITIAL PROGRAM CREATION (DEBUG VERSION)  * ICA01030
*  04/18/83  RICK JASPER    MAJOR REVISION                            * ICA01040
*  05/24/83  RICK JASPER    ADDED DIAL-ABLE TERMINAL SUPPORT.  CAN    * ICA01050
*                           NOW LOGON TO UTS FROM VM TERMINAL.        * ICA01060
*  06/24/83  RICK JASPER    CHANGED THE LENGTH OF THE READ FOR THE    * ICA01070
*                           REQUEST CONTROL BLOCK FROM 128 TO 108.    * ICA01080
*                           THIS WAS BECAUSE OF HARDWARE PROBLEMS     * ICA01090
*                           WITH JEFF DOBBEK'S DOBBOX.  ONE OF THESE  * ICA01100
*                           DAYS HE MAY SAY TO CHANGE IT BACK.        * ICA01110
*                                                                     * ICA01120
*********************************************************************** ICA01130
         EJECT                                                          ICA01140
         PRINT GEN,NODATA                                               ICA01150
         ENTRY ICATS,TRACETBL,NEXTTTE,ICDATA                            ICA01160
         EXTRN ICATEXIH                                                 ICA01170
ICATS    START X'20000'             CMS LOAD ADDRESS                    ICA01180
         USING NUCON,R0             NUCON DOESN'T NEED A BASE REGISTER  ICA01190
         USING ICDATA,R2            ADDRESS ICATS COMMON DATA AREA      ICA01200
         USING CBTERM,R3         USE R3 TO ADDRESS TERMINAL CB'S        ICA01210
         USING CBUTS,R4          USE R4 TO ADDRESS UTS CONTROL BLOCK    ICA01220
         USING CBUSER,R5         USE R5 TO ADDRESS USER CONTROL BLOCK   ICA01230
         USING CBDISK,R6         USE R6 TO ADDRESS DISK CONTROL BLOCK   ICA01240
         USING SMSGNTRY,R7          SMSG BUFFER BASE REGISTER.  R7 IS   ICA01250
*               USED ONLY OCCASIONALLY AND MUST BE RELOADED EACH TIME   ICA01260
         USING *,R11,R12            R11 AND R12 BOTH WILL BE BASE REGS  ICA01270
         LR    R11,R15              ESTABLISH FIRST BASE REGISTER       ICA01280
         LA    R12,4095(R11)        ESTABLISH SECOND BASE REGISTER      ICA01290
         LA    R12,1(R12)                                               ICA01300
         L     R2,AICDATA           ESTABLISH DATA AREA ADDRESSABILITY  ICA01310
         ST    R14,SAVER14          SAVE CMS RETURN ADDRESS             ICA01320
         EJECT                                                          ICA01330
*********************************************************************** ICA01340
*     SET UP TO HANDLE SPECIAL MESSAGES (SMSG'S)                      * ICA01350
*********************************************************************** ICA01360
         HNDEXT SET,ICATEXIH        HANDLE EXTERNAL INTERRUPTS          ICA01370
*                                                                       ICA01380
         STCTL C0,C0,CONTROL0       GET A COPY OF CONTROL REGISTER 0    ICA01390
         OI    CONTROL0+3,X'01'     TURN ON LOW ORDER BIT AND           ICA01400
         LCTL  C0,C0,CONTROL0       RELOAD IT                           ICA01410
*                                                                       ICA01420
*     SET UP VMCF PARAMETER LIST (VMCPARM) FOR AUTHORIZE                ICA01430
*                                                                       ICA01440
         MVI   VMCPFLG1,VMCPSMSG    I WILL ACCEPT SMSG'S ONLY           ICA01450
*                                   NO SPECIFIC OR PRIORITY REQUESTS    ICA01460
         MVC   VMCPFUNC,=AL2(VMCPAUTH)  AUTHORIZE VMCF SUBFUNCTION      ICA01470
         MVC   VMCPVADA,=A(SMSGBUFF)    SPECIFY MY INPUT BUFFER         ICA01480
         MVC   VMCPLENA,=A(L'SMSGBUFF)                                  ICA01490
         LA    R7,VMCPARM                                               ICA01500
         DIAG  R7,R8,X'0068'        AUTHORIZE MYSELF TO ACCEPT SMSG'S   ICA01510
         LTR   R8,R8                CHECK VMCF RETURN CODE              ICA01520
         BZ    CONT1                IT REALLY SHOULD NEVER FAIL         ICA01530
         LINEDIT TEXT='THE VMCP AUTHORIZE INSTRUCTION FAILED.  THE RETU-ICA01540
               RN CODE IS ....',SUB=(DEC,(R8))                          ICA01550
         B     QUIT                                                     ICA01560
         SPACE 4                                                        ICA01570
*********************************************************************** ICA01580
*     DETERMINE AND SAVE MY VM USER ID AND THIS VM NODE ID.           * ICA01590
*********************************************************************** ICA01600
CONT1    EQU   *                                                        ICA01610
         LA    R1,IDENTIFY                                              ICA01620
         SVC   202            THIS STACKS A LINE INTO THE CONSOLE STACK ICA01630
         DC    AL4(*+4)                                                 ICA01640
         RDTERM CURRTEXT      THE LINE CONTAINS 9 TOKENS LIKE SO,       ICA01650
         LA    R1,CURRLEN+1   USERID . NODEID . NET-USER-ID .           ICA01660
         STH   R0,CURRLEN     STORE LINE LENGTH JUST BEFORE LINE        ICA01670
         LA    R0,PARM1       MIGHT AS WELL TEMPORARILY USE PARM1-15    ICA01680
         L     R15,APARSE                                               ICA01690
         BALR  R14,R15                                                  ICA01700
         MVC   MYVMUID,PARM1                                            ICA01720
         MVC   MYNODEID,PARM3                                           ICA01710
         MVC   NETVMUID,PARM5                                           ICA01730
         EJECT                                                          ICA01740
*********************************************************************** ICA01750
*     GO READ IN THE CONFIGURATION FILE, CONFIGURE, AND THEN GO       * ICA01760
*     VARY ON AND ATTACH EACH UTS.                                    * ICA01770
*********************************************************************** ICA01780
         L     R15,=V(CONFIG)       GET CONFIG MODULE'S ENTRY POINT     ICA01790
         BALR  R14,R15              GO CONFIGURE                        ICA01800
         L     R15,=V(ATTACH)       GO TRY TO VARY ON EACH UTS          ICA01810
         BALR  R14,R15                                                  ICA01820
         EJECT                                                          ICA01830
*********************************************************************** ICA01840
*     THIS IS THE DISPATCHER.  LOOP HERE UNTIL THEY SAY TO QUIT.      * ICA01850
*     THIS IS WHERE MY WAIT STATE PSW POINTS TO WHEN THERE'S NOTHING  * ICA01860
*     TO DO.  WHEN AN INTERRUPT COMES IN, THE WAIT BIT IN THAT PSW    * ICA01870
*     GETS SHUT OFF AND WE START RUNNING FROM THIS POINT.             * ICA01880
*********************************************************************** ICA01890
*                                                                       ICA01900
DISPATCH DS    0H                                                       ICA01910
         TM    FLAGA,ENDPGM         TIME TO QUIT YET ??                 ICA01920
         BO    QUIT                 YEP, GO AHEAD AND QUIT.             ICA01930
         SSM   DISABSSM             SHUT OFF I/O & EXTERNAL INTERRUPTS  ICA01940
*              NUMFINRD IS A NUCON LABEL                                ICA01950
         CLC   NUMFINRD,=H'0'       ANY COMMANDS FROM THE CONSOLE ??    ICA01960
         BNE   CONSOLE              IF SO, GO BRANCH TO READ COMMAND.   ICA01970
*                                                                       ICA01980
         TM    FLAGA,TERMINT        CHECK FOR A TERMINAL INTERRUPT      ICA01990
         BNO   DISPCONA             IF THERE WASN'T ONE, CONTINUE ON    ICA02000
         L     R15,=V(DOTERM)       ELSE CALL THE ROUTINE THAT'LL       ICA02010
*                                   HANDLE TERMINAL REQUESTS.           ICA02020
         BALR  R14,R15              GO HANDLE A TERMINAL INTERRUPT      ICA02030
         B     DISPATCH             THEN RETURN TO THE DISPATCHER.      ICA02040
*                                                                       ICA02050
DISPCONA CLC   CURRSMSG,NEXTSMSG    SEE IF THERE'S A STACKED SMSG       ICA02060
         BNE   SMSG                 IF THERE WAS ONE, GO GET IT.        ICA02070
*                                                                       ICA02080
         TM    FLAGA,UTSINT         CHECK FOR ANY UTS INTERRUPTS        ICA02090
         BO    UTS                  IF THERE WAS ONE, GO GET RCB.       ICA02100
*                                                                       ICA02110
*********************************************************************** ICA02120
*     WE HAVEN'T ANYTHING TO DO, SO LET'S GO INTO AN ENABLED WAIT     * ICA02130
*     STATE UNTIL SOMETHING HAPPENS.  IF ANY I/O INTERRUPTS TAKE      * ICA02140
*     PLACE, CMS WILL WAKE US UP BY TURNING OFF THE WAIT BIT IN OUR   * ICA02150
*     PSW.  IF AN SMSG COMES IN, OUR EXTERNAL INTERRUPT HANDLER       * ICA02160
*     ROUTINE WILL SHUT IT OFF.                                       * ICA02170
*********************************************************************** ICA02180
         ETTE  SLEEPTTE                                                 ICA02190
         LPSW  WAITPSW              WAIT FOR SOMETHING TO HAPPEN        ICA02200
SLEEPTTE DC    AL1(L'SLEEPTXT)                                          ICA02210
SLEEPTXT DC    C'NOTHING TO DO.  TIME TO SLEEP'                         ICA02220
         DS    0H                                                       ICA02230
         EJECT                                                          ICA02240
*                                                                       ICA02250
*********************************************************************** ICA02260
*     COME HERE FROM THE DISPATCHER ROUTINE WITH INTERRUPTS STILL     * ICA02270
*     DISABLED WHEN THERE'S A LINE WAITING TO BE READ FROM THE        * ICA02280
*     CONSOLE.                                                        * ICA02290
*     1)  TURN ON "DOING A CONSOLE COMMAND" FLAG,                     * ICA02300
*     2)  TURN THE INTERRUPTS BACK ON,                                * ICA02310
*     3)  READ THE LINE,                                              * ICA02320
*     4)  GO PROCESS THE COMMAND.                                     * ICA02330
*     5)  TURN OFF "DOING A CONSOLE COMMAND" FLAG                     * ICA02340
*********************************************************************** ICA02350
*                                                                       ICA02360
CONSOLE  DS    0H                                                       ICA02370
         OI    FLAGB,CONSCMD        REMEMBER YOU'RE DOING A CONSOLE CMD ICA02380
         SSM   ENABSSM              TURN INTERRUPTS BACK ON             ICA02390
         RDTERM CURRTEXT            READ THE LINE IN                    ICA02400
         STH   R0,CURRLEN           REMEMBER LINE LENGTH                ICA02410
         BAL   R14,PARSECMD         GO PROCESS THE COMMAND              ICA02420
         NI    FLAGB,ALL-CONSCMD    FINISHED WITH THIS CONSOLE COMMAND  ICA02430
         B     DISPATCH             GO BACK TO DISPATCHER               ICA02440
         EJECT                                                          ICA02450
*                                                                       ICA02460
*********************************************************************** ICA02470
*     COME HERE FROM THE DISPATCHER ROUTINE WITH INTERRUPTS STILL     * ICA02480
*     DISABLED WHEN THE CURRENT SMSG POINTER IS NOT EQUAL TO THE      * ICA02490
*     NEXT SMSG POINTER (MEANING THAT THERE'S AN SMSG TO PROCESS).    * ICA02500
*     1)  MOVE THAT SMSG DATA INTO THE CURRENT SMSG AREA,             * ICA02510
*     2)  BUMP TO THE NEXT SMSG BUFFER,                               * ICA02520
*     3)  TURN THE INTERRUPTS BACK ON,                                * ICA02530
*     4)  GO PROCESS THE COMMAND,                                     * ICA02540
*     5)  TURN OFF "DOING A CONSOLE COMMAND" FLAG,                    * ICA02550
*     6)  AND RETURN TO THE DISPATCHER.                               * ICA02560
*********************************************************************** ICA02570
*                                                                       ICA02580
SMSG     DS    0H                                                       ICA02590
         OI    FLAGB,SMSGCMD        REMEMBER YOU'RE DOING AN SMSG CMD   ICA02600
         L     R7,CURRSMSG            PICK UP NEXT SMSG                 ICA02610
         MVC   SMSGVMID,SMSGUID       REMEMBER USER ID OF SMSG SENDER   ICA02620
         MVC   CURRLEN,SMSGLEN        MOVE SMSG LENGTH                  ICA02630
         MVC   CURRTEXT,SMSGTEXT      MOVE IN SMSG TEXT, BLANKS AND ALL ICA02640
         LA    R7,139(R7)             BUMP TO NEXT SMSG BUFFER AREA     ICA02650
         C     R7,LASTSMSG            TOO BIG YET ??                    ICA02660
         BNH   SMSGCONT               NOPE, CONTINUE ON                 ICA02670
         L     R7,FRSTSMSG            ELSE USE FIRST SMSG BUFFER AGAIN  ICA02680
SMSGCONT DS    0H                                                       ICA02690
         ST    R7,CURRSMSG            SAVE IT BEFORE INTERRUPTS ARE ON  ICA02700
         SSM   ENABSSM                NOW TURN INTERRUPTS BACK ON       ICA02710
         BAL   R14,PARSECMD         GO PROCESS THE COMMAND              ICA02720
         NI    FLAGB,ALL-SMSGCMD    FINISHED WITH THIS SMSG COMMAND     ICA02730
         B     DISPATCH             RETURN TO DISPATCHER                ICA02740
         EJECT                                                          ICA02750
*                                                                       ICA02760
*********************************************************************** ICA02770
*     COME HERE FROM THE DISPATCHER ROUTINE WITH INTERRUPTS STILL     * ICA02780
*     DISABLED WHEN THERE'S A UTS MACHINE OUT THERE WAITING TO BE     * ICA02790
*     SERVICED.                                                       * ICA02800
*     1)  LOOP THROUGH THE UTSCB CHAIN AND FIND WHICH UTS NEEDS       * ICA02810
*         SERVICING.                                                  * ICA02820
*         A)  IF NO UTS NEEDS SERVICING, THEN                         * ICA02830
*             1)  TURN OFF THE A-UTS-NEEDS-SERVICING FLAG.            * ICA02840
*             2)  TURN INTERRUPTS BACK ON.                            * ICA02850
*             3)  RETURN TO THE DISPATCHER.                           * ICA02860
*         B)  IF ONE IS FOUND, THEN                                   * ICA02870
*             1)  TURN OFF HIS INTERRUPT-IS-IN FLAG.                  * ICA02880
*             2)  TURN ON HIS I'M-GETTING-SERVICED FLAG.              * ICA02890
*             3)  TURN ON THE I'M-DOING-A-UTS-COMMAND FLAG.           * ICA02900
*             4)  MOVE THE ADDRESS OF THIS UTSCB INTO THISUTS.        * ICA02910
*             5)  TURN INTERRUPTS BACK ON.                            * ICA02920
*             6)  GO READ IN THE REQUEST CONTROL BLOCK FROM THIS UTS. * ICA02930
*             7)  GO PROCESS THE COMMAND.                             * ICA02940
*             8)  TURN OFF HIS I'M-GETTING-SERVICED FLAG.             * ICA02950
*             9)  TURN OFF THE I'M-DOING-A-UTS-COMMAND FLAG.          * ICA02960
*            10)  RETURN TO THE DISPATCHER.                           * ICA02970
*********************************************************************** ICA02980
*                                                                       ICA02990
UTS      DS    0H                                                       ICA03000
*    LOOP THROUGH THE UTSCB CHAIN TO SEE WHICH UTS NEEDED SERVICING     ICA03010
*    IT'LL BE THE ONE WITH THE INTERRUPT-IS-IN FLAG TURNED ON.          ICA03020
         L     R4,CBFIRST          GET ADDRESS OF FIRST UTSCB           ICA03030
UTSLOOPA LTR   R4,R4               ARE WE PAST THE END-OF-CHAIN ??      ICA03040
         BZ    UTSNONE             YEP, A NEEDY UTS WAS NOT FOUND       ICA03050
         TM    CBUTSFGA,INTISIN    ELSE, SEE IF THIS ONE'S IN NEED      ICA03060
         BO    UTSGOTIT            YEP, IT IS.  GO SERVICE HIM.         ICA03070
         L     R4,CBUTSFP          HAVEN'T FOUND A NEEDY UTS YET.       ICA03080
         B     UTSLOOPA            GO CHECK THE NEXT ONE.               ICA03090
*                                                                       ICA03100
*  COME HERE WHEN THERE'S NO UTS OUT THERE THAT NEEDS TO BE SERVICED.   ICA03110
*  THIS'LL HAPPEN AFTER WE'VE JUST GOT THROUGH SERVICING ONE AND A      ICA03120
*  NEW REQUEST FROM ANOTHER UTS HAS NOT COME IN (NORMAL CASE).          ICA03130
UTSNONE  DS    0H                                                       ICA03140
         NI    FLAGA,ALL-UTSINT    TURN OFF UTS INTERRUPT SWITCH        ICA03150
         SSM   ENABSSM             TURN INTERRUPTS BACK ON              ICA03160
         B     DISPATCH            RETURN TO DISPATCHER                 ICA03170
*                                                                       ICA03180
*  WE'VE FOUND A UTS THAT NEEDS SERVICING.  LET'S GO DO IT.             ICA03190
UTSGOTIT DS    0H                                                       ICA03200
         NI    CBUTSFGA,ALL-INTISIN   TURN OFF INTERRUPT-IS-IN FLAG     ICA03210
         OI    CBUTSFGA,IGOTIT        TURN ON I'M-GETTING-IT FLAG       ICA03220
         OI    FLAGB,UTSCMD           REMEMBER YOU'RE DOING A UTS CMD   ICA03230
         ST    R4,THISUTS             REMEMBER THIS UTSCB ADDRESS       ICA03240
         SSM   ENABSSM                TURN INTERRUPTS BACK ON           ICA03250
*  GO GET HIS REQUEST COMMAND BLOCK                                     ICA03260
*        LA    R0,128          R0 = LENGTH OF THE REQUEST CONTROL BLOCK ICA03270
         LA    R0,108     FOR NOW, ONLY READ 108 BYTES.   RAJ  6-24-83  ICA03280
         LA    R1,PARM0        R1 = ADDRESS OF THE RCB                  ICA03290
         L     R15,AREADRCB                                             ICA03300
         BALR  R14,R15         GO READ IN THE REQUEST CONTROL BLOCK     ICA03310
         LTR   R10,R15         WERE THERE ANY I/O ERRORS ??             ICA03320
         BZ    DOUTSCMD                                                 ICA03330
         LH    R8,CBUTSCSW                                              ICA03340
         SR    R9,R9                                                    ICA03350
         IC    R9,SENSE0                                                ICA03360
         LINEDIT TEXT='I/O ERROR GETTING REQUEST CONTROL BLOCK.  REQUES-ICA03370
               T IGNORED.  READRCB RC = ...., CSW STATUS = ...., SENSE -ICA03380
               BYTE = ..',SUB=(DEC,(R10),HEX,(R8),HEX,(R9)),RENT=NO     ICA03390
         B     DONTDO                                                   ICA03400
DOUTSCMD BAL   R14,DOCMD            GO PROCESS THE COMMAND              ICA03410
DONTDO   NI    FLAGB,ALL-UTSCMD     FINISHED WITH THIS UTS COMMAND      ICA03420
         NI    CBUTSFGA,ALL-IGOTIT  TURN OFF I'M-GETTING-IT FLAG        ICA03430
         NI    FLAGC,ALL-FAKEINT    RESET FAKE UTS INTERRUPT FLAG       ICA03440
         B     DISPATCH             RETURN TO DISPATCHER                ICA03450
         EJECT                                                          ICA03460
*********************************************************************** ICA03470
*     THIS IS THE COMMAND PROCESSOR.  COME HERE TO INTERPRET THE      * ICA03480
*     COMMAND AND TO LOCATE AND EXECUTE THE CORRECT COMMAND ROUTINE.  * ICA03490
*     THERE ARE TWO ENTRY POINTS YOU CAN BRANCH AND LINK TO,          * ICA03500
*     PARSECMD - IF YOU NEED UNFORMATTED INPUT PARSED INTO 8-BYTE     * ICA03510
*                TOKENS (USING CMS'S SCAN ROUTINE) FIRST, OR          * ICA03520
*     DOCMD - IF THE COMMAND IS ALREADY PARSED (AS IT IS WHEN THE     * ICA03530
*             COMMAND IS FROM ONE OF THE UTS MACHINES).               * ICA03540
*     UPON ENTRY, THE FOLLOWING CONDITIONS ARE SET UP;                * ICA03550
*         R2  = ADDRESS OF ICDATA (AS ALWAYS)                         * ICA03560
*         R11 = FIRST BASE REGISTER                                   * ICA03570
*         R12 = SECOND BASE REGISTER                                  * ICA03580
*         R14 = MY RETURN ADDRESS.                                    * ICA03590
*         FLAGB = INDICATES WHETHER THIS IS A CONSOLE COMMAND, AN     * ICA03600
*                 SMSG COMMAND, OR A UTS COMMAND.                     * ICA03610
*         PARM0  = REQUESTOR'S USER ID (CONSOLE & SMSG CMDS ONLY).    * ICA03620
*         CURRLEN  = LENGTH OF UNPARSED COMMAND IF PARSE REQUESTED.   * ICA03630
*         CURRTEXT = UNPARSED COMMAND TEXT IF PARSE REQUESTED.        * ICA03640
*         PARM0-PARM15 = UP TO 16 8-BYTE TOKENS IF COMMAND IS         * ICA03650
*                        ALREADY PARSED.                              * ICA03660
*                                                                     * ICA03670
*     FUNCTION:                                                       * ICA03680
*         1)  IF PARSING IS NEEDED, THE FIELDS CURRLEN & CURRTEXT     * ICA03690
*             ARE PARSED INTO THE FIELDS PARM1-PARM15.                * ICA03700
*         2)  PUT AN ENTRY INTO THE TRACE TABLE.                      * ICA03710
*         3)  PARM1 IS TAKEN TO BE THE COMMAND NAME AND A CHECK       * ICA03720
*             IS MADE OF THE RESIDENT COMMAND ROUTINE LIST.           * ICA03730
*             IF THE COMMAND IS RESIDENT, THEN TURN ON THE            * ICA03740
*             RESIDENT-COMMAND FLAG AND GO TO STEP 5).                * ICA03750
*         4)  IF THE COMMAND IS NOT RESIDENT, LOOK ON OUR DISK        * ICA03760
*             FOR THE FILE 'COMMAND-NAME TEXT A'.  IF THERE, THEN     * ICA03770
*             GO TO STEP 4), ELSE IT'S AN UNKNOWN COMMAND NAME.       * ICA03780
*             REJECT THIS REQUEST.                                    * ICA03790
*         5)  IF THE COMMAND EXISTS OUT ON DISK, THEN SAVE THE        * ICA03800
*             LOADER COUNT AND "INCLUDE" THE TEXT FILE IN.            * ICA03810
*             CONTINUE ON JUST AS IF THE ROUTINE WAS RESIDENT ALL     * ICA03820
*             ALONG (EXCEPT THE RESIDENT-COMMAND FLAG IS NOT SET).    * ICA03830
*         6)  BRANCH AND LINK TO THE COMMAND ROUTINE.                 * ICA03840
*         7)  UPON RETURN, IF THE RESIDENT-COMMAND FLAG IS OFF,       * ICA03850
*             THEN RESTORE THE LOADER COUNT.                          * ICA03860
*         8)  YOU'RE DONE PROCESSING THIS COMMAND.  RETURN TO CALLER. * ICA03870
*********************************************************************** ICA03880
PARSECMD DS    0H                                                       ICA03890
         ST    R14,DOCMDR14   SAVE MY RETURN ADDRESS                    ICA03900
         LA    R0,PARM1       PUT PARMS STARTING AT PARM1, NOT PARM0    ICA03910
         LA    R1,CURRLEN+1   GET ADDRESS OF COMMAND LENGTH & TEXT      ICA03920
         L     R15,APARSE     GET ADDRESS OF PARSE ROUTINE              ICA03930
         BALR  R14,R15        GO PARSE THE COMMAND LINE                 ICA03940
         B     CMDCONTB       GO INTERPRET WHAT WE'VE GOT               ICA03950
*                                                                       ICA03960
*    ALTERNATE ENTRY POINT WHEN YOU DON'T REQUIRE PARSING               ICA03970
*                                                                       ICA03980
DOCMD    DS    0H                                                       ICA03990
         ST    R14,DOCMDR14   SAVE MY RETURN ADDRESS                    ICA04000
CMDCONTB DS    0H                                                       ICA04010
*    PUT AN ENTRY INTO THE TRACE TABLE                                  ICA04020
         TM    FLAGB,UTSCMD            START THE TRACE TABLE ENTRY      ICA04030
         BNO   CMDTRAC1                WITH THE TYPE OF COMMAND THIS    ICA04040
         MVC   DISPTYPE,=C'UTS    '    IS, EITHER A UTS COMMAND, A      ICA04050
         B     CMDTRAC3                CONSOLE COMMAND, OR A SMSG       ICA04060
CMDTRAC1 TM    FLAGB,CONSCMD           COMMAND.                         ICA04070
         BNO   CMDTRAC2                                                 ICA04080
         MVC   DISPTYPE,=C'CONSOLE'                                     ICA04090
         B     CMDTRAC3                                                 ICA04100
CMDTRAC2 MVC   DISPTYPE,=C'SMSG   '                                     ICA04110
CMDTRAC3 ETTE  DISPTTE                 RECORD PARM0 - PARM15            ICA04120
         LH    R7,CMDCNT        GET COUNT OF RESIDENT COMMANDS          ICA04130
         LTR   R7,R7            TEST FOR NO RESIDENT COMMANDS           ICA04140
         BZ    NOTRES           BRANCH IF THERE ARE NONE TO CHECK       ICA04150
         LA    R8,RESCMDS       GET ADDRESS OF RESIDENT COMMAND NAMES   ICA04160
         B     CMDCONTC         SKIP NEXT INSTR. FIRST TIME THROUGH     ICA04170
CMDUP3   LA    R8,12(R8)     BUMP TO THE NEXT RESIDENT COMMAND NAME     ICA04180
CMDCONTC CLC   PARM1,0(R8)   IS IT THIS RESIDENT COMMAND ??             ICA04190
         BE    FOUNDRES      YEP, GOT A RESIDENT COMMAND                ICA04200
         BCT   R7,CMDUP3     NOPE, CHECK NEXT RESIDENT COMMAND NAME     ICA04210
*                                                                       ICA04220
NOTRES   DS    0H     THIS COMMAND IS NOT RESIDENT, LOOK FOR IT ON DISK ICA04230
         MVC   STATEFN,PARM1    MOVE COMMAND NAME INTO FSSTATE FN       ICA04240
         LA    R7,STATEFN       PREPARE FOR FSSTATE MACRO               ICA04250
         FSSTATE (R7)         DOES THE FILE COMMAND-NAME TEXT A EXIST ? ICA04260
         LTR   R15,R15          WAS THE FILE FOUND ??                   ICA04270
         BNZ   BADCMD           NO, THIS MUST BE A INVALID COMMAND      ICA04280
*********************************************************************** ICA04290
*     WE'VE FOUND THE FILE COMMAND-NAME TEXT ON OUR A-DISK.  NOW      * ICA04300
*     LOAD IT IN (ACTUALLY DONE WITH CMS'S INCLUDE COMMAND, NOT       * ICA04310
*     CMS'S LOAD COMMAND SO THAT THE LOADER TABLES ARE PRESERVED      * ICA04320
*     AND THE COMMAND MODULE'S EXTERNAL REFERENCES GET RESOLVED)      * ICA04330
*********************************************************************** ICA04340
CMDCONTD DS    0H                                                       ICA04350
         OI    FLAGC,NORESCMD       TURN ON NON-RESIDENT COMMAND FLAG   ICA04360
         MVC   SAVTBENT,TBENT       SAVE LOADER'S EXTERNAL ENTRY COUNT  ICA04370
*              SO THAT NEXT TIME WE CALL THIS COMMAND, WE WON'T GET THE ICA04380
*              "DUPLICATE IDENTIFIER" MESSAGE FROM THE LOADER           ICA04390
         MVC   CMDNAME,PARM1        MOVE COMMAND NAME TO INCLUDE CMD FN ICA04400
         L     R1,AINCLCMD                                              ICA04410
         SVC   202                  GO LOAD IN THE COMMAND MODULE       ICA04420
         DC    AL4(*+4)                                                 ICA04430
         L     R8,=X'0002C000'      GET COMMAND MODULE'S ENTRY POINT    ICA04440
         LTR   R7,R15               DID EVERYTHING GO OK WITH THE LOAD? ICA04450
         BZ    CMDCONTE             GREAT, CONTINUE ON                  ICA04460
*********************************************************************** ICA04470
*   YOU GOT SOME ERROR LOADING THIS COMMAND ROUTINE IN.  SEE WHO TO   * ICA04480
*   GIVE THIS ERROR MESSAGE TO, THE UTS, THE CONSOLE, OR THE SMSG'ER. * ICA04490
*********************************************************************** ICA04500
         TM    FLAGB,UTSCMD     IS THIS A UTS COMMAND ??                ICA04510
         BNO   LOADCONA         NOPE, CONTINUE ON                       ICA04520
*    SET RETCODE = X'5000' AND DATA LENGTH = 0                          ICA04530
         MVC   PARM15,=X'5000000000000000'                              ICA04540
         LA    R0,128                 PREPARE FOR REPLY-TO-UTS ROUTINE  ICA04550
         LA    R1,PARM0                                                 ICA04560
         L     R15,AWRITUTS     GIVE THE REPLY CONTROL BLOCK TO THE UTS ICA04570
         BALR  R14,R15          IGNORE ANY ERRORS                       ICA04580
         B     LOADBYE          RETURN TO THE DISPATCHER                ICA04590
LOADCONA DS    0H                                                       ICA04600
         LINEDIT TEXT='ERROR LOADING THE ........ COMMAND ROUTINE.  INC-ICA04610
               LUDE COMMAND RC = ....',SUB=(CHARA,PARM1,DEC,(R7)),RENT=-ICA04620
               NO,DISP=NONE,BUFFA=MYBUFR                                ICA04630
         LA    R1,MYBUFR        GET ADDRESS OF INVALID COMMAND MESSAGE  ICA04640
         L     R15,AMESSAGE     GET THE ADDRESS OF THE MESSAGE ROUTINE  ICA04650
         BALR  R14,R15          DELIVER THE ABOVE MESSAGE               ICA04660
LOADBYE  DS    0H                                                       ICA04670
         B     CMDEND           WE'RE FINISHED HERE.                    ICA04680
         EJECT                                                          ICA04690
FOUNDRES DS    0H                                                       ICA04700
         L     R8,8(R8)             GET RESIDENT COMMAND'S ENTRY POINT  ICA04710
CMDCONTE DS    0H                                                       ICA04720
*********************************************************************** ICA04730
*     JOIN HERE WHETHER COMMAND IS RESIDENT OR NOT WITH ITS STARTING  * ICA04740
*     ADDRESS IN R8, WAITING FOR THE BALR TO IT.                      * ICA04750
*********************************************************************** ICA04760
         LR    R15,R8             MOVE COMMAND ENTRY POINT TO R15       ICA04770
         BALR  R14,R15            GO DO THIS COMMAND                    ICA04780
*********************************************************************** ICA04790
*     WE ARE DONE PROCESSING THIS COMMAND (FOR BETTER OR FOR WORSE).  * ICA04800
*     CHECK TO SEE IF WE GOTTA RESTORE THE LOADER FLAG AND RETURN.    * ICA04810
*********************************************************************** ICA04820
CMDEND   DS    0H                                                       ICA04830
         TM    FLAGC,NORESCMD                                           ICA04840
         BNO   CMDCONTF             DON'T DO IT IF A RESIDENT CMD       ICA04850
         SPKA  0(0)             SET PSW KEY TO 0 FOR STORE, ELSE        ICA04860
*                               WE'LL GET A PROTECTION EXCEPTION        ICA04870
         MVC   TBENT,SAVTBENT       RESTORE LOADER'S COUNTER IN NUCON   ICA04880
         SPKA  X'E0'            SET PSW KEY BACK TO NORMAL (X'E')       ICA04890
         NI    FLAGC,ALL-NORESCMD   RESET FLAG                          ICA04900
CMDCONTF L     R14,DOCMDR14                                             ICA04910
         BR    R14              RETURN TO CALLER                        ICA04920
         EJECT                                                          ICA04930
*********************************************************************** ICA04940
*  COME HERE WHEN THIS COMMAND ISN'T IN OUR RESIDENT COMMAND LIST AND * ICA04950
*  WE CAN'T FIND IT ON OUR A-DISK, THEREFORE IT'S AN INVALID COMMAND. * ICA04960
*  DETERMINE WHERE IT CAME FROM AND TELL HIM HE SCREWED UP.           * ICA04970
*********************************************************************** ICA04980
BADCMD   DS    0H                                                       ICA04990
         TM    FLAGB,UTSCMD     IS THIS A UTS COMMAND ??                ICA05000
         BNO   BADCONTA         NOPE, CONTINUE ON                       ICA05010
*    SET RETCODE = X'1000' AND DATA LENGTH = 0                          ICA05020
         MVC   PARM15,=X'1000000000000000'                              ICA05030
         LA    R0,128           PREPARE FOR REPLY-TO-UTS ROUTINE        ICA05040
         LA    R1,PARM0                                                 ICA05050
         L     R15,AWRITUTS     GIVE THE REPLY CONTROL BLOCK TO THE UTS ICA05060
         BALR  R14,R15          IGNORE ANY ERRORS.                      ICA05070
         B     BADBYE           RETURN TO THE DISPATCHER                ICA05080
BADCONTA DS    0H                                                       ICA05090
         MVC   MSG1CMD,PARM1    PUT THE INVALID COMMAND IN THE MESSAGE  ICA05100
         LA    R1,MSG1          GET ADDRESS OF INVALID COMMAND MESSAGE  ICA05110
         L     R15,AMESSAGE     GET THE ADDRESS OF THE MESSAGE ROUTINE  ICA05120
         BALR  R14,R15          SAY "XXX IS NOT AN ICATS COMMAND"       ICA05130
*    THE REASON I DON'T USE THE REJECT ROUTINE HERE IS BECAUSE I WANTED ICA05140
*    TO DIFFERENTIATE BETWEEN NOT FINDING THE COMMAND MODULE AS IN THIS ICA05150
*    CASE, AND A COMMAND MODULE REJECTING THE COMMAND.                  ICA05160
*    THE FIRST  CASE GIVES XXX IS NOT AN ICATS COMMAND.                 ICA05170
*    THE SECOND CASE GIVES XXX IS AN INVALID ICATS COMMAND.             ICA05180
BADBYE   DS    0H                                                       ICA05190
         B     CMDEND           WE'RE FINISHED HERE.                    ICA05200
         EJECT                                                          ICA05210
*********************************************************************** ICA05220
*     HERE IS WHERE THE SHUTDOWN ROUTINE GOES                         * ICA05230
*********************************************************************** ICA05240
QUIT     DS    0H                                                       ICA05250
*                                                                       ICA05260
*    BLAH BLAH BLAH BLAH BLAH BLAH BLAH                                 ICA05270
*    THERE'S WORK TO BE DONE HERE ALSO, LIKE STOP TAKING INTERRUPTS     ICA05280
*    FROM THE UTS'S                                                     ICA05290
         HNDEXT CLR                 STOP HANDLING EXTERNAL INTERRUPTS   ICA05300
         NI    CONTROL0+3,X'FE'     SHUT OFF THAT BIT TO STOP TAKING    ICA05310
         LCTL  C0,C0,CONTROL0       SMSG'S AND RESTORE CONTROL REG 0    ICA05320
*                                                                       ICA05330
*     SET UP VMCF PARAMETER LIST (VMCPARM) FOR UNAUTHORIZE              ICA05340
*                                                                       ICA05350
         MVC   VMCPFUNC,=AL2(VMCPUAUT)  UNAUTHORIZE VMCF SUBFUNCTION    ICA05360
         LA    R7,VMCPARM                                               ICA05370
         DIAG  R7,R8,X'0068'                                            ICA05380
         LTR   R8,R8                CHECK VMCF RETURN CODE              ICA05390
         BZ    QUIT1                IT REALLY SHOULD NEVER FAIL         ICA05400
         LINEDIT TEXT='THE VMCP UNAUTHORIZE INSTRUCTION FAILED.  THE RE-ICA05410
               TURN CODE IS ....',SUB=(DEC,(R8))                        ICA05420
QUIT1    DS    0H                                                       ICA05430
*********************************************************************** ICA05440
*     GET RID OF ALL THE DIALABLE TERMINALS.                          * ICA05450
*********************************************************************** ICA05460
         L     R3,TERM1ST          GET ADDRESS OF FIRST TERMCB          ICA05470
LOOPA    LTR   R3,R3               ARE WE PAST THE END-OF-CHAIN ??      ICA05480
         BZ    QUIT2               YEP, GET OUT OF THIS LOOP.           ICA05490
         MVC   DROPCUU(3),CBTERMEA                                      ICA05500
         LA    R1,DROPCMD                                               ICA05510
         SVC   202                                                      ICA05520
         DC    AL4(*+4)                                                 ICA05530
         L     R3,CBTERMFP         GO ON TO NEXT TERMINAL               ICA05540
         B     LOOPA               IF THERE IS A NEXT ONE.              ICA05550
QUIT2    DS    0H                                                       ICA05560
         LA    R15,0            MAKE CMS RETURN CODE = 0                ICA05570
         L     R14,SAVER14                                              ICA05580
         BR    R14              RETURN TO CMS                           ICA05590
         DROP  R11                                                      ICA05600
         DROP  R12                                                      ICA05610
*                                                                       ICA05620
*********************************************************************** ICA05630
*******************                                 ******************* ICA05640
*******************       END OF ICATS MAINLINE     ******************* ICA05650
*******************                                 ******************* ICA05660
*********************************************************************** ICA05670
         EJECT                                                          ICA05680
         PRINT   GEN,NODATA                                             ICA05690
*                                                                       ICA05700
*********************************************************************** ICA05710
*     START OF ICATS DATA AREA                                        * ICA05720
*********************************************************************** ICA05730
*                                                                       ICA05740
         DS    0D                PUT PSW'S ON DOUBLEWORD BOUNDARY       ICA05750
CMSXNEW  DS    D                 SAVE AREA FOR CMS'S EXTERNAL NEW PSW   ICA05760
ENABSSM  DC    X'FF'             MASK TO ENABLE I/O & EXT. INTERRUPTS   ICA05770
DISABSSM DC    X'00'             MASK TO DISABLE I/O & EXT. INTERRUPTS  ICA05780
AICDATA  DC    A(ICDATA)         ADDRESS OF ICATS COMMON DATA AREA      ICA05790
TEMP     DS    F                 TEMPORARY WORK SPACE                   ICA05800
CONTROL0 DS    F                 MY CONTROL REGISTER 0 - LATER RESTORED ICA05810
*     THE NEXT LINE MUST BE DONE THIS WAY INSTEAD OF A LA INSTRUCTION   ICA05820
AINCLCMD DC    X'00',AL3(INCLCMD)   TO INSURE HIGH ORDER BYTE IS X'00'  ICA05830
IDENTIFY DS    0D                IDENTIFY COMMAND                       ICA05840
         DC    CL8'IDENTIFY'                                            ICA05850
         DC    CL8'('                                                   ICA05860
         DC    CL8'LIFO'                                                ICA05870
         DC    8X'FF'                                                   ICA05880
*                                                                       ICA05890
INCLCMD  DS    0D                CMS INCLUDE COMMAND TO LOAD            ICA05900
         DC    CL8'INCLUDE'      NON-RESIDENT COMMAND MODULES IN WITH   ICA05910
CMDNAME  DS    CL8                                                      ICA05920
         DC    CL8'('                                                   ICA05930
         DC    CL8'ORIGIN'       PUT HIM AT X'2C000' SINCE I'M AT       ICA05940
         DC    CL8'2C000'        X'20000' - THAT GIVES ME 48 K          ICA05950
         DC    CL8'NOMAP'        DON'T BOTHER WITH A LOAD MAP           ICA05960
         DC    CL8'NOAUTO'       DON'T RESOLVE UNRESOLVED REFERENCES    ICA05970
         DC    CL8'NOLIBE'       DON'T SEARCH IN ANY LIBRARIES          ICA05980
         DC    8X'FF'                                                   ICA05990
*                                                                       ICA06000
         DS    0D                                                       ICA06010
STATEFN  DC    CL8' '                                                   ICA06020
         DC    CL8'TEXT'                                                ICA06030
         DC    CL2'A'                                                   ICA06040
         DC    8X'FF'                                                   ICA06050
*                                                                       ICA06060
         DS    0D                                                       ICA06070
DROPCMD  DC    CL8'CP'                                                  ICA06080
         DC    CL8'DETACH'                                              ICA06090
DROPCUU  DC    CL8' '                                                   ICA06100
         DC    8X'FF'                                                   ICA06110
*                                                                       ICA06120
SAVTBENT DS    H                                                        ICA06130
*********************************************************************** ICA06140
*     RESIDENT COMMAND LIST.  TO MAKE A COMMAND RESIDENT, INCREMENT   * ICA06150
*     THE RESIDENT COMMAND COUNT (CMDCNT) AND INCLUDE THE COMMAND     * ICA06160
*     NAME ALONG WITH IT'S ADDRESS IN THE RESIDENT COMMAND LIST       * ICA06170
*     (RESCMDS).  IF THE COMMAND MODULE IS ASSEMBLED SEPARATE         * ICA06180
*     FROM THIS ICATS MAINLINE, IT MUST HAVE A V-TYPE ADDRESS         * ICA06190
*     CONSTANT.  ELSE USE AN A-TYPE ADDRESS CONSTANT.  CMS WILL       * ICA06200
*     AUTOMATICALLY LOAD THE COMMAND MODULE WHEN ICATS GETS LOADED.   * ICA06210
*         THIS SCHEME ALSO ALLOWS ANY NUMBER OF ABBREVIATIONS OR      * ICA06220
*     SYNONYMS OF RESIDENT COMMANDS ONLY (NO ABBREVIATIONS OR         * ICA06230
*     SYNONYMS FOR NON-RESIDENT COMMMANDS - MAYBE SOME DAY) BY        * ICA06240
*     SIMPLY LISTING THEM.  SEE QUIT AND TRACE FOR EXAMPLES.          * ICA06250
*     ALSO, CERTAIN COMMANDS MAY BE IGNORED HERE LIKE ENTERING        * ICA06260
*     AN ASTERISK (CONSIDERED A COMMENT).                             * ICA06270
*********************************************************************** ICA06280
         CNOP  2,4                                                      ICA06290
CMDCNT   DC    H'16'                                                    ICA06300
RESCMDS  DC    CL8'QUIT    ',V(QUIT)                                    ICA06310
         DC    CL8'Q       ',V(QUIT)                                    ICA06320
         DC    CL8'STATUS  ',V(STATUS)                                  ICA06330
         DC    CL8'TRACE   ',V(TRACE)                                   ICA06340
         DC    CL8'TEST    ',V(TEST)                                    ICA06350
         DC    CL8'T       ',V(TRACE)                                   ICA06360
         DC    CL8'FAKIT   ',V(FAKIT)                                   ICA06370
         DC    CL8'F       ',V(FAKIT)                                   ICA06380
         DC    CL8'*       ',V(IGNORCMD)                                ICA06390
         DC    CL8'        ',V(IGNORCMD)                                ICA06400
         DC    CL8'CAT     ',V(CAT)                                     ICA06410
         DC    CL8'READ    ',V(READ)                                    ICA06420
         DC    CL8'WRITE   ',V(WRITE)                                   ICA06430
         DC    CL8'TIME    ',V(TIME)                                    ICA06440
         DC    CL8'RESTART ',V(RESTART)                                 ICA06450
         DC    CL8'TERMIO  ',V(TERMIO)                                  ICA06460
         EJECT                                                          ICA06470
*                                                                       ICA06480
*********************************************************************** ICA06490
*     TRACE TABLE ENTRIES                                             * ICA06500
*********************************************************************** ICA06510
CONCTTE  DC    AL1(L'CONCTTET)                                          ICA06520
CONCTTET DC    C'DISPATCH CONSOLE CMD   '                               ICA06530
SMSGCTTE DC    CL24'GOT AN SMSG COMMAND.    '                           ICA06540
UTSCTTE  DC    CL24'GOT A UTS COMMAND.      '                           ICA06550
*                                                                       ICA06560
*********************************************************************** ICA06570
*     ICATS MESSAGES                                                  * ICA06580
*********************************************************************** ICA06590
MSG1     DC    AL1(MSG1EQU)                                             ICA06600
MSG1CMD  DS    CL8               PUT THE UNKNOWN COMMAND NAME HERE      ICA06610
         DC    C' IS NOT AN ICATS COMMAND'                              ICA06620
MSG1EQU  EQU   *-MSG1-1                                                 ICA06630
         EJECT                                                          ICA06640
*                                                                     * ICA06650
*********************************************************************** ICA06660
*       VMCPARM CONTROL BLOCK AS DESCRIBED IN THE VM SYSTEM           * ICA06670
*       PROGRAMMERS GUIDE ON PAGE 174.  THE NUMBERS AND LETTERS       * ICA06680
*       IN THE LAST PART OF THE LINE IS A GUIDE TO WHICH FIELDS       * ICA06690
*       ARE USED FOR EACH FUNCTION (0-B).                             * ICA06700
*                    VMCF FUNCTIONS = 0 1 2 3 4 5 6 7 8 9 A B         * ICA06710
*********************************************************************** ICA06720
         DS    0D                                                       ICA06730
VMCPARM  DS    0CL40                                                    ICA06740
VMCPFLG1 DC    X'00'                  0   2 3 4           A             ICA06750
VMCPAUTS    EQU    X'80'                                                ICA06760
VMCPPRTY    EQU    X'40'                                                ICA06770
VMCPSMSG    EQU    X'20'                                                ICA06780
VMCPFLG2 DC    X'00'                                                    ICA06790
VMCPFUNC DC    X'0000'                0 1 2 3 4 5 6 7 8 9 A B           ICA06800
VMCPAUTH    EQU    X'0000'                                              ICA06810
VMCPUAUT    EQU    X'0001'                                              ICA06820
VMCPSEND    EQU    X'0002'                                              ICA06830
VMCPSENR    EQU    X'0003'                                              ICA06840
VMCPSENX    EQU    X'0004'                                              ICA06850
VMCPRECV    EQU    X'0005'                                              ICA06860
VMCPCANC    EQU    X'0006'                                              ICA06870
VMCPREPL    EQU    X'0007'                                              ICA06880
VMCPQUIE    EQU    X'0008'                                              ICA06890
VMCPRESM    EQU    X'0009'                                              ICA06900
VMCPIDEN    EQU    X'000A'                                              ICA06910
VMCPRJCT    EQU    X'000B'                                              ICA06920
VMCPMID  DC    X'00000000'                2 3 4 5 6 7       B           ICA06930
VMCPUSER DC    X'0000000000000000'    0   2 3 4 5 6 7     A B           ICA06940
VMCPVADA DC    X'00000000'            0   2 3 4 5   7                   ICA06950
VMCPLENA DC    X'00000000'            0   2 3 4 5   7                   ICA06960
VMCPVADB DC    X'00000000'                  3                           ICA06970
VMCPLENB DC    X'00000000'                  3                           ICA06980
VMCPUSE  DC    X'0000000000000000'        2 3 4 5   7     A B           ICA06990
         EJECT                                                          ICA07000
SAVER14  DS    F                                                        ICA07010
DOCMDR14 DS    F                                                        ICA07020
MYBUFR   DS    CL80                                                     ICA07030
         LTORG                                                          ICA07040
*********************************************************************** ICA07050
*       HERE ARE ALL THE BIG DATA STRUCTURES.  THEY MUST GO AFTER     * ICA07060
*       ALL THE ICATS MAINLINE DATA AREAS AND SUBROUTINES, AND        * ICA07070
*       CAN GO HERE BEFORE ALL THE COMMON SUBROUTINES THAT USE        * ICA07080
*       THEIR OWN BASE REGISTERS.  NOBODY ADDRESSES THESE THINGS      * ICA07090
*       DIRECTLY, BUT RATHER EVERYBODY USES POINTERS TO THESE         * ICA07100
*       AREAS THAT RESIDE IN THE ICATS COMMON DATA AREA (ICDATA).     * ICA07110
*********************************************************************** ICA07120
*********************************************************************** ICA07130
*   SMSG BUFFER AREA.  THERE'S ROOM HERE FOR 10 SMSG'S.  EACH GETS    * ICA07140
*   STACKED IN A CIRCULAR QUEUE BY THE EXTERNAL INTERRUPT HANDLING    * ICA07150
*   ROUTINE AND GETS PULLED OUT BY THE SMSG COMMAND HANDLING ROUTINE. * ICA07160
*   THE SMSG COMMAND HANDLER IS ALWAYS TRYING TO CATCH UP TO THE      * ICA07170
*   EXTERNAL INTERRUPT HANDLING ROUTINE.                              * ICA07180
*   TO CHANGE THE SIZE OF THE SMSG BUFFER, SIMPLY CHANGE THE NUMBER   * ICA07190
*   10 IN THE DC'S FOR LASTMSG AND SMSGBUFR.                          * ICA07200
*********************************************************************** ICA07210
SMSGBUFR DS    10CL139                  SMSG BUFFER (1390 BYTES)        ICA07220
*********************************************************************** ICA07230
*   THIS IS THE TRACE TABLE.  THERE'S ROOM FOR ABOUT 28 144-BYTE      * ICA07240
*   ENTRIES.  TRACE TABLE ENTRIES ARE VARIABLE LENGTH AND IN THIS     * ICA07250
*   FORMAT;      DC    AL8('HEX TIME STAMP')                          * ICA07260
*                DC    AL1('LENGTH OF FOLLOWING ENTRY')  255 MAX      * ICA07270
*                DC    C'ANY LENGTH TRACE TABLE ENTRY'   PADDED TO    * ICA07280
*                                        END ON A 16-BYTE BOUNDARY    * ICA07290
*   TO CHANGE THE SIZE OF THE TRACE TABLE, SIMPLY CHANGE THE NUMBER   * ICA07300
*   512 IN THE DC'S FOR LASTTTE (IN ICDATA) AND TRACETBL.             * ICA07310
*********************************************************************** ICA07320
*                                                                       ICA07330
         ORG   (*-ICATS+15)/16*16+ICATS                                 ICA07340
TRACETBL DS    512CL16         512 * 16 = 8192 = AN 8K TRACE TABLE      ICA07350
*********************************************************************** ICA07360
*   THIS IS THE UTS, THE USER, AND THE DISK CONTROL BLOCK CHAINS.     * ICA07370
*   TO CHANGE THE SIZE OF THE RESERVED STORAGE FOR THESE STRUCTURES,  * ICA07380
*   CHANGE THE 1000 IN THE DC'S FOR CBEND (IN ICDATA) AND CBCHAIN.    * ICA07390
*********************************************************************** ICA07400
*                                                                       ICA07410
CBCHAIN  DS    1000D                                                    ICA07420
*                                                                       ICA07430
         EJECT                                                          ICA07440
         ICDATA GEN=REAL                                                ICA07450
         LTORG                                                          ICA07460
         NUCON                                                          ICA07470
ICATS    CSECT              RETURN TO NORMAL CSECT                      ICA07480
*                                                                       ICA07490
*    THE NEXT 2 LINES ARE THERE JUST TO LET CMS KNOW, VIA THE LOADER,   ICA07500
*    HOW MUCH MEMORY I INTEND TO USE IN THIS PROGRAM.  THE LAST THING   ICA07510
*    IN MY MEMORY WILL BE THE OUTPUT BUFFER WHICH STARTS AT X'30000'    ICA07520
*    AND GOES ON FOR X'30088' (SEE ABUFFER & LBUFFER).                  ICA07530
*    262280 = X'40088' = (START OF BUFFER) + (LENGTH OF BUFFER)         ICA07540
*                        - START OF PROGRAM (X'20000')                  ICA07550
*    THE REASON I DO THIS IS SO THAT CMS WILL NOT ALLOCATE GETMAIN      ICA07560
*    AND DMSFREE REQUESTS OVER THE TOP OF MY PROGRAM.                   ICA07570
*        ORG   ICATS+262280                                             ICA07580
*        DC    X'FA'                                                    ICA07590
         END                                                            ICA07600