         PCC      0                                                             
         SYSTEM   SIG9P                                                         
         SYSTEM   OPTIONS                                                       
*   ENTRY POINTS                                                                
         DEF      IOEX                                                          
         DEF      STPIO1,STPIO2,STRTIO1,STRTIO2                                 
         DEF      DEACTV,ACTV                                                   
*   EXIT POINTS                                                                 
         DEF      IOXTRAPX,IOXEXIT                                              
         PSYS     0                                                             
OLAYFLAG EQU      'IOEX'                                                        
         SYSTEM   CPRMON                                                        
         TITLE    '** IOEX **'                                                  
         PAGE                                                                   
**************                                                                  
*   GETDOD   *                                                                  
**************                                                                  
*                                                                               
*   ROUTINE GETS THE DCT INDEX FOR THE 'DOD' PARAMETER IN                       
*     IOEX AND STOPIO CALLS                                                     
*                                                                               
*   AT ENTRY:    R4   LINK                                                      
*              R4   LINK                                                        
*                                                                               
*   AT EXIT :  R7   TRUE DCT INDEX. IF RAD FILE DCT INDEX OF RAD                
*                                                                               
*   RETURN IS  +1 IF ERROR FOUND, +2 OTHERWISE                                  
*                                                                               
*   REGISTERS   USED:   R4,R5,R7,R8,R9,R13,R14, AND R15 IF ERROR                
*                                                                               
*   USES:   GETDCTX,TMVADR                                                      
*                                                                               
*                                                                               
GETDOD   RES      0                                                             
         LI,R15   -1                                                            
         BAL,R5   GETPI             GET (POSSIBLY INDIRECT) PARAMETER           
         NOP                        IGNORE NO-SKIP RETURN                       
         LW,R8    0,R3              FOR FLAGS ONLY                              
         LW,R7    R15               DIRECT PARAMETER                            
         AND,R7   X1FFFF            GET DCB/OP/DEVICE                           
         BEZ      0,R4              ERROR IF ZERO                               
         CI,R8    X'40000'          IS IT A DEV. INDEX                          
         BAZ      GETDOD0           NO, BRANCH                                  
         CH,R7    DCT1              YES, IS IT TOO BIG                          
         BLE      1,R4              NO, RETURN                                  
         B        0,R4              YES, TAKE ERROR EXIT                        
GETDOD0  RES      0                                                             
         CI,R8    X'20000'          IS IT AN OP LABEL                           
         BAZ      GETDOD1           NO, BRANCH                                  
         LI,R8    K3                PSEUDO DCB WORD 0                           
         B        GETDOD2                                                       
GETDOD1  RES      0                                                             
         PUSH     R4                                                            
         BAL,R4   GETDCBAD          GET DCB ADDRESS                             
         PUSH     R10                                                           
         BAL,R4   OPENDCB           INSURE DCB IS OPEN                          
         B        GETDOD95          B IF CANT OPEN DCB                          
         PULL     R10                                                           
         PULL     R4                                                            
         LW,R8    0,R2              DCB WORD 0                                  
         LW,R7    1,R2              DCB WORD 1                                  
         LW,R5    R4                LINK NEEDED IN BOTH R4 AND R5               
         CI,R8    2                 IS DCB ASSIGNED TO RAD FILE                 
         BAZ      GETDOD5           YES                                         
GETDOD2  RES      0                                                             
         LW,R5    R4                SAVE RETURN ADDRESS                         
         BAL,R4   GETDCTX           GO GET DCT OR RFT INDEX/SIG7-3181/*C5732 C01
         B        *R5               ERROR RETURN, TAKE ERROR EXIT               
         CI,R7    X'80'             IS IT A RAD FILE                            
         BAZ      GETDOD6           NO,DEVICE INDEX                             
         AND,R7   X7F                                                           
         CH,R7    RFT4              IS IT A LEGAL INDEX, NOT TOO BIG ?          
         BG       *R5               NO, ERROR                                   
         LB,R7    RFT8,R7           GET MASTER DICT. INDEX                      
GETDOD3  CW,R7    K:NUMDA           IS INDEX VALID                              
         BG       *R5               NO, TAKE ERROR EXIT                         
*                 ZERO VALUE IS VALID IN TYPE FIELD OF DCB /SIG7-3181/*C5732 C01
         LB,R7    MDDCTI,R7         GET THE DEVICE INDEX FOR THE AREA           
         B        1,R5              EXIT                                        
GETDOD5  SLS,R7   -8                                                            
         AND,R7   X3F               GET MASTER DICT. INDEX                      
         B        GETDOD3                                                       
GETDOD6  CH,R7    DCT1              TRUE DEVICE                                 
         BLE      1,R5              YES,OK                                      
         B        0,R5              ERROR                                       
*                                                                               
GETDOD95 RES      0                 ERROR IN OPENDCB                            
         PULL     R10                                                           
         LW,R15   R9                ERROR CODE TO R15                           
         PULL     R5                                                            
         B        0,R5              RETURN                                      
         TITLE    '** IOEX - STOPIO/STARTIO CAL **'                             
**************                                                                  
*   STPIO1   *                                                                  
*   STPIO2   *                                                                  
*   STRTIO1  *                                                                  
*   STRTIO2  *                                                                  
*   DEACTV   *                                                                  
*   ACTV     *                                                                  
**************                                                                  
*                                                                               
*                                                                               
*   AT ENTRY:     R1   FPT CODE                                                 
*                 R3   FPT ADDRESS                                              
*                                                                               
*                                                                               
DEACTV   RES      0                 ENTRY FOR DEACTIVATE ALL I/O                
         LW,R10   STIO92            GET B INSTRUCTION                           
         B        %+2                                                           
ACTV     RES      0                 ENTRY FOR ACTIVATE ALL I/O                  
         LW,R10   STIO93            GET B INSTRUCTION                           
         LI,R11   DCT3                                                          
         B        STIO3                                                         
STPIO1   LI,R11   DCT15             ENTRY FOR STOP ALL SYSTEM I/O               
         B        %+2                                                           
STPIO2   LI,R11   DCT14             ENTRY FOR STOP ALL BCKG I/O                 
         LW,R10   STIO90            GET  MTB,1  INSTRUCTION                     
         B        STIO3                                                         
STRTIO1  LI,R11   DCT15             ENTRY FOR START ALL SYSTEM I/O              
         B        %+2                                                           
STRTIO2  LI,R11   DCT14             ENTRY FOR START ALL BCKG. I/O               
         LW,R10   STIO91            GET   MTB,-1   INSTRUCTION                  
STIO3    EQU      %                                                             
         BIFBKG   SETCC3            ERROR IF CALLER IS BKGD                     
STIO4    RES      0                                                             
         BAL,R4   GETDOD            GO GET DCT INDEX IN R7                      
         B        IOXTRAPX          ERROR RETURN FROM GETDOD                    
         LH,R0    *R3               1ST HALF OF FPT WORD 0                      
         CI,R0    X'80'             IS P0=1                                     
         BAZ      STIO4A            NO, WORD 1 NOT PRESENT                      
         LI,R15   K9                YES, GET END ACT. INFO                      
         BAL,R4   CKENACT                                                       
         B        IOXTRAPX          BAD END-ACT. INFO                           
         CI,R15   0                 WAS END ACTION SPECIFIED                    
         BE       STIO4A            NO                                          
         CI,R1    X'10'             YES, IS THIS STOP ALL SYS I/O               
         BNE      IOXTRAPX          NO, PRE-EMPT ONLY FOR STOP ALL I/O          
STIO4A   RES      0                                                             
         LH,R12   DCT1,R7           R12= DEVICE NUMBER                          
         LH,R0    *R3               GET 1ST HALF OF FPT WORD 0                  
         LI,R9    X'28'             MASK FOR DEV AND IOP                        
         AND,R9   R0                                                            
         CI,R9    8                 DO WE RESERVE ENTIRE IOP                    
         BNE      STIO4B            NO                                          
         LI,R9    X'FF00'           YES, R9=MASK FOR IOP                        
         B        STIO5                                                         
STIO4B   RES      0                                                             
         CI,R12   X'80'             IS IT A MULTI-UNIT DEVICE                   
         BAZ      STIO10            NO                                          
         CI,R9    X'20'             DO WE RESERVE A DEVICE                      
         BE       STIO10            YES                                         
         LI,R9    X'FFF0'           NO,R9=MASK FOR IOP AND CONTROLLER           
STIO5    LH,R2    DCT1                                                          
         LH,R8    DCT1,R2                                                       
         CS,R8    R12                                                           
         BE       STIO7                                                         
STIO6    BDR,R2   %-3                                                           
STIO65   LI,R2    0                 CLEAR CC               /SIG7-3181/*C5732 C01
         B        SETCC             NORMAL EXIT                                 
STIO7    DISABLE                                                                
         LB,R13   *R11,R2           GET PROPER DCT ENTRY                        
         MTH,1    DCT10,R2        INCREMENT DAC            /SIG7-2185/*C5732    
         EXU      R10               STEP OR REDUCE COUNT                        
         BEZ      STIO12             BRANCH IF COUNT REDUCED TO ZERO            
         CI,R13   -1                IS COUNT FOULED UP                          
         BNE      STIO8             NO                                          
         LI,R13   0                 YES, RESET TO 0                             
STIO8    STB,R13  *R11,R2           STORE UPDATED VALUE                         
         ENABLE                                                                 
         LH,R0    *R3               GET 1ST HALF OF FPT WORD 0                  
         CI,R0    X'80'             IS WORD 1 PRESENT                           
         BAZ      STIO8A            NO                                          
         CI,R1    X'10'             IS FPT CODE= STOP ALL I/O                   
         BNE      STIO8A            NO, NOT PREEMPTING                          
         LW,R5    1,R3              YES, R5= FPT WORD 1                         
         CW,R5    Y008              IS P9=1                                     
         BANZ     STIO9             YES, BEING PREEMPTED                        
STIO8A   RES      0                                                             
         CI,R0    K10               WAS HIO REQUESTED                           
         BAZ      STIO9F            NO, BRANCH                                  
STIO9    LB,R5    DCT5,R2           GET SWITCHES                                
         CI,R5    1                 IS DEVICE DEDICATED TO IOEX                 
         BAZ      STIO9A            NO, RIPOFF REQUESTS ON DEVICE               
         LH,R8    DCT1,R2           R8= DEVICE ADDRESS                          
         HIO,R13  *R8               ELSE, DO HIO NOW                            
         B        STIO9D                                                        
STIO9A   RES      0                                                             
         LB,R5    IOQ4              R5= NO OF QUEUE ENTRIES                     
         DISABLE                                                                
STIO9B   CB,R2    IOQ7,R5           IS THE QUEUE ENTRY FOR THIS DEVICE          
         BNE      STIO9C            NO, TRY NEXT                                
         PUSH     16,R0             YES, SAVE ALL REGISTERS                     
         LW,R3    R5                POINTER TO ENTRY TO RIPOFF                  
         LB,R2    TCBPOINT          TASK ID                                     
         LW,R2    STIPRIO,R2                                                    
         LB,R2    R2                PRIORITY                                    
         BAL,R5   RIPOFF            KILL THE REQUEST                            
         PULL     16,R0             RESTORE REGISTERS                           
         B        STIO9A            B TO MAKE SURE IT'S STILL GONE              
STIO9C   BDR,R5   STIO9B            LOOP BACK FOR NEXT                          
         ENABLE                     DONE                                        
STIO9D   RES      0                                                             
         CI,R1    X'10'             IS FPT CODE= STOP ALL I/O                   
         BNE      STIO9F            NO, NOT PREEMPTING THIS DEVICE              
         LH,R0    *R3               1ST HALF OF FPT WORD 0                      
         CI,R0    X'80'             P0=1                                        
         BAZ      STIO9F            NO, NOT PREEMPTING                          
         LW,R0    1,R3              YES, GET FPT WORD 1                         
         CW,R0    Y008              IS P9 BIT=1                                 
         BAZ      STIO9F            NO, BRANCH                                  
         STW,R15  DCT12,R2          YES, STORE END ACTION INFO                  
         LB,R5    DCT5,R2           SWITCHES AND FLAGS                          
         OR,R5    X1                SET IOEX ONLY BIT                           
         STB,R5   DCT5,R2           STORE BACK                                  
STIO9F   RES      0                                                             
         CI,R9    0                 IS THIS SINGLE DEV. CASE                    
         BE       STIO65            YES  NORMAL EXIT       /SIG7-3181/*C5732 C01
         B        STIO6             NO, GO BACK FOR NEXT DEVICE                 
*                                                                               
*                                                                               
*                                                                               
STIO10   LW,R2    R7                SET R2 TO INDEX                             
         LI,R9    0                 SET R9=0 FOR SINGLE DEV. ONLY               
         B        STIO7               UNIT DEV. AND NO IOP OPTION               
STIO12   CI,R11   DCT15              WAS THIS AN IOEX START UP                  
         BNE      STIO8              NO                                         
         LI,R5    0                                                             
         STW,R5   DCT12,R2          ZERO END-ACTION INFO                        
         LB,R5    DCT5,R2                                                       
         AND,R5   XFE               YES, MASK OUT IOEX BUSY BIT                 
         STB,R5   DCT5,R2           RESET IOEX BUSY FLAG                        
         B        STIO8                                                         
STIO90   AI,R13   1                                                             
STIO91   AI,R13   -1                                                            
STIO92   B        STIO100                                                       
STIO93   B        STIO200                                                       
*                                                                               
*                                                                               
*   HERE IF DEACTIVATING A DEVICE, CONTROLLER OR IOP                            
STIO100  RES      0                                                             
         OR,R13   X20               SET 'DEVICE DOWN'                           
         STB,R13  *R11,R2           STORE UPDATED ENTRY(DCT3)                   
         B        STIO9                                                         
*                                                                               
*                                                                               
*   HERE IF ACTIVATING A DEVICE, CONTROLLER OR IOP                              
STIO200  RES      0                                                             
         AND,R13  XDF               RESET 'DEVICE DOWN'                         
         STB,R13  *R11,R2           STORE UPDATED ENTRY (DCT3)                  
         B        STIO9F                                                        
         TITLE    '** IOEX - IOEX CAL PROCESSING **'                            
************                                                                    
*   IOEX   *                                                                    
************                                                                    
*                                                                               
*   ROUTINE PROCESSES ALL IOEX CALLS                                            
*   IOEX CALLS REQUIRE THE #IOEX ASSEMBLY OPTION TO BE NONZERO.                 
*   THE CALLS MAY BE ONE OF THE FOLLOWING:                                      
*        SIO                                                                    
*        TIO                                                                    
*        TDV                                                                    
*        HIO                                                                    
*                                                                               
*   AT ENTRY:     R1    FPT CODE                                                
*                 R3    FPT ADDRESS                                             
*                                                                               
*                                                                               
         DO       #IOEX                                                         
IOEX     RES      0                                                             
         BIFMAP   SETCC3            ERROR IF USER MAPPED                        
         BIFBKG   SETCC3            ERROR IF USER BKGD                          
         BAL,R4   GETDOD            GO GET DCT INDEX AND CHECK LEGALITY         
*                                     OF WORD 1                                 
         B        IOXTRAPX          ERROR RETURN, TAKE TRAP EXIT                
IOEX2    AI,R1    -X'12'            R1=ORDER CODE LESS X'12'                    
         BNEZ     IOEX3             NOT AN SIO                                  
*                                                                               
*   SIO                                                                         
*                                                                               
         LI,R15   K1                P1 PARAMETER                                
         BAL,R5   GETFPTN           GET IOCD ADDRESS IN R15                     
         B        IOXTRAPX          NOT PRESENT, BAD CAL                        
         LW,R10   R15               R10= IOCD ADDRESS                           
         AND,R10  M24               MASK                                        
         CI,R10   1                 IS IT A DW ADDRESS                          
         BANZ     IOXTRAPX          NO, BAD CAL                                 
         LW,R9    R10               YES, VERIFY ADDRESS                         
         BAL,R8   TMVADR                                                        
         B        IOXTRAPX          ERROR, BAD ADDRESS                          
         CI,R0    0                 IS IT WRITEABLE                             
         BNE      IOXTRAPX          NO, ERROR                                   
         SLS,R10  -1                YES, R10=DW ADDRESS OF CLIST                
*   PROCESS END-ACTION                                                          
         LI,R15   K2                                                            
         BAL,R4   CKENACT           GET END ACTION                              
         B        IOXTRAPX          ERROR IN END-ACTION DATA                    
         LB,R5    DCT5,R7           FLAGS                                       
         CI,R5    1                 IS THIS AN IOEX ONLY DEVICE                 
         BANZ     IOEX2A            YES, DON'T QUEUE REQUEST                    
*   HERE THE REQUEST WILL BE QUEUED                                             
         LW,R8    CUPCOD4           CLEANUP CODE FOR NO POSTING                 
         LW,R5    1,R3              FPT WORD 1                                  
         CI,R5    F0                IS F0= 1                                    
         BAZ      %+2               NO                                          
         OR,R8    Y002              YES, SET DEV. DOWN OVERRIDE                 
         LW,R9    R15               END-ACTION WORD TO R9                       
         BEZ      %+2               NO END ACTION                               
         OR,R8    Y004              SET E.A. BIT IN CUPWORD                     
         LW,R1    R10               SAVE IOCD ADDRESS IN R1                     
         OR,R10   Y4                SET CMD CHAIN BIT                           
         LI,R11   0                 R11= DEFAULT TIMEOUT VALUE                  
         LI,R15   K3                                                            
         BAL,R5   GETFPTN           GET TIMEOUT VALUE                           
         B        IOEX1A            B IF NOT PRESENT                            
         LI,R14   0                                                             
         DW,R14   X5                R15= TIMEOUT IN 5 SEC INTERVALS             
         CI,R14   0                 IS THERE A REMAINDER                        
         BEZ      %+2               NO                                          
         AI,R15   1                 YES, ROUND UP                               
         LW,R11   R15               R11= TIMEOUT VALUE                          
IOEX1A   RES      0                                                             
         LB,R2    TCBPOINT          TASK I.D.                                   
         LW,R13   STIPRIO,R2        R13= PRIORITY WORD                          
         LB,R13   R13               R13= PRIORITY                               
         LI,R6    0                 SET NRT=0                                   
         BAL,R5   QUEUE             QUEUE THE REQUEST                           
         B        SETCC2            SET CC FOR SIO FAIL                         
         LI,R2    0                 SET CC FOR SIO ACCEPTED                     
         LW,R8    R1                CURRENT CMD DW ADDRESS                      
         LW,R9    Y1                STATUS WORD                                 
         B        IOEX6A            STORE CC AND STATUS DW                      
IOEX2A   RES      0                                                             
         LW,R0    R10               R0=DW ADDR OF CLIST                         
         STW,R15  DCT12,R7          STORE END-ACTION DATA                       
         LB,R4    DCT5,R7           GET SWITCHES                                
         CI,R4    X'80'             IS THE DEVICE BUSY                          
         BANZ     %-2               YES, LOOP TILL FREE                         
         B        IOEX6             EXECUTE THE SIO                             
*                                                                               
*                                                                               
IOEX3    RES      0                                                             
         CI,R1    3                 IS IT AN HIO                                
         BNE      IOEX6             NO, PROCESS TDV,TIO                         
*                                                                               
*   HIO                                                                         
*                                                                               
         LB,R5    DCT5,R7           GET SWITCHES                                
         CI,R5    1                 IS IT AN IOEX DEVICE                        
         BANZ     IOEX6             YES, DO IT NOW                              
         LI,R8    0                 SET IOCD ADDR=0                             
IOEX4    LB,R2    TCBPOINT          TASK I.D.                                   
         LB,R3    IOQ4              NO. OF QUEUE ENTRIES                        
         DISABLE                                                                
IOEX4A   CW,R2    IOQECB,R3         DOES TASK ID MATCH                          
         BNE      IOEX4B            NO, BRANCH                                  
         CB,R7    IOQ7,R3           YES, DOES DCTX MATCH                        
         BNE      IOEX4B            NO, GET NEXT ENTRY                          
         LW,R8    IOQ8,R3           YES,R8= IOCD ADDRESS                        
         AND,R8   M24               MASK                                        
         LW,R2    STIPRIO,R2        PRIORITY WORD                               
         LB,R2    R2                R2=TASK PRIORITY                            
         PUSH     2,R7              SAVE R7,R8                                  
         BAL,R5   RIPOFF            KILL THE REQUEST                            
         PULL     2,R7                                                          
         B        IOEX4             START AT TOP OF Q AND MAKE                  
*                                    SURE ALL ENTRIES ARE GONE.                 
IOEX4B   BDR,R3   IOEX4A            LOOP                                        
         ENABLE                     DONE                                        
         LW,R9    Y1                STATUS WORD                                 
         LI,R2    0                 SET CC= HIO ACCEPTED                        
         B        IOEX6A            STORE STATUS AND CC IN STACK                
*                                                                               
*   TIO OR TDV                                                                  
*                                                                               
IOEX6    RES      0                                                             
         LH,R2    DCT1,R7           R2= DEVICE ADDRESS                          
         EXU      IOEX90,R1         DO THE PROPER INSTR.                        
         STCF     R2                SAVE CC IN R2 (4 BITS FOR 550)              
         DO       #550=0                                                        
         LB,R1    TCBPOINT                                                      
         LD,R1    STIRTSB,R1        CAL STACK BASE                              
         LW,R3    Y3                                                            
         LS,R2    -CAL1PUSH+16,R1   USER CC3,4 WITH IOEX CC1,2                  
         FIN      #550=0                                                        
IOEX6A   LB,R1    TCBPOINT          TASK I.D.                                   
         LD,R1    STIRTSB,R1        CAL STACK BASE                              
         STW,R8   -CAL1PUSH+8,R1    STORE STATUS WORD 1                         
         STW,R9   -CAL1PUSH+9,R1    STORE STATUS WORD 2                         
         B        IOEX8             B TO STORE CC                               
*                                                                               
*   SET CONDITION CODES IN USER'S PSD IN STACK.                                 
*                                                                               
SETCC2   LW,R2    Y4                SET CC= 0100                                
         B        SETCC                                                         
         FIN      #IOEX                                                         
*                                                                               
SETCC3   LW,R2    Y2                SET CC= 0010                                
SETCC    LB,R1    TCBPOINT          TASK I.D.                                   
         LD,R1    STIRTSB,R1        CAL STACK BASE                              
IOEX8    LW,R3    YF                MASK FOR STORE                              
         STS,R2   -CAL1PUSH+16,R1   STORE CC IN PSD IN STACK                    
         B        IOXEXIT           CALEXIT                                     
*                                                                               
         DO       #IOEX                                                         
*                                                                               
*   TABLE OF INSTRUCTIONS EXECUTED VIA EXU INSTRUCTION                          
*                                                                               
IOEX90   SIO,R8   *R2                                                           
         TIO,R8   *R2                                                           
         TDV,R8   *R2                                                           
         HIO,R8   *R2                                                           
         ELSE     #IOEX                                                         
IOEX     EQU      SETCC3                                                        
         FIN      #IOEX                                                         
*                                                                               
*   EXIT POINTS                                                                 
*                                                                               
IOXTRAPX B        TRAPX                                                         
IOXEXIT  B        CALEXIT                                                       
*                                                                               
         OLAYEND                                                                
         END                                                                    
