         PCC      0                                                             
         SYSTEM   SIG5P                                                         
         SYSTEM   OPTIONS                                                       
         DO       #SYMB                                                         
*   ENTRY POINTS                                                                
         DEF      SYM4                                                          
         DEF      RCOOP,WCOOP                                                   
         DEF      SMBCDHEX,SMHEXBCD                                             
*   EXIT POINTS                                                                 
         DEF      SYM4X1,SYM4X2                                                 
         DEF      BCDHEXX,HEXBCDX                                               
OLAYFLAG EQU      'SYM4'                                                        
         SYSTEM   CPRMON                                                        
*                                                                               
SYM4     RES      0                                                             
*                                                                               
         PAGE                                                                   
*                                                                               
*   EXITS                                                                       
*                                                                               
SYM4X1P  PULL     R5                                                            
SYM4X1   B        0,R5                                                          
SYM4X2P  PULL     R5                                                            
SYM4X2   B        1,R5                                                          
         TITLE    '** SYM4 - COOPERATIVE ROUTINES **'                           
**********                                                                      
*  COOP  *                                                                      
**********                                                                      
*                                                                               
*   THE COOPERATIVE IS A SET OF ROUTINES CALLED BY APPROPRIATE                  
*   FILE MANAGEMENT ROUTINES ANYTIME INPUT OR OUTPUT TO SYMBIONT                
*   DEDICATED DEVICES MAY OCCUR.  THE INPUT COOPERATIVE READS                   
*   FROM A FILE IN THE IS AREA AS A RESULT OF A USER REQUEST                    
*   TO READ A SYMBIONT DEDICATED CARD READER.                                   
*                                                                               
*   THE OUTPUT COOPERATIVE WRITES TO A FILE IN THE OS AREA                      
*   AS A RESULT OF A USER WRITE REQUEST TO A SYMBIONT                           
*   DEDICATED LINE PRINTER.                                                     
*                                                                               
*  REGISTERS AT ENTRY:   SAME AS AT ENTRY TO FMQUEUE                            
*                                                                               
*   EXITS ARE:    +1    ERROR OCCURRED, R9= ERROR CODE                          
*                 +2    IF COOP I/O WAS SUCCESSFUL,R9= NORMAL TYC               
*                 +3    IF THE DEVICE IS NOT A SYMBIONT DEVICE.                 
*                                                                               
*   AT EXIT R10,R11 PRESERVED, ALL OTHER REGISTERS LOST                         
*                                                                               
*        BAL,R5   COOP                                                          
*                                                                               
         TITLE    '** SYM4 - INPUT COOPERATIVE **'                              
*                                                                               
*   PROCESS INPUT REQUESTS TO A SYMBIONT DEDICATED DEVICE.                      
*                                                                               
RCOOP    RES      0                                                             
         PUSH     R5                SAVE LINK TO COOP CALLER                    
         PUSH     2,R10             BUFFER ADDR, BYTE COUNT                     
         LI,R15   K30               MASK FOR STORE                              
         LW,R14   R10               R14= BYTE ADDR OF BUFFER                    
         SLS,R14  4                 R14 HAS BTD POSITIONED FOR DCB              
         STS,R14  RCDCB             STORE BTD IN DCB                            
         SLS,R10  -2                R10= WORD ADDRESS OF BUFFER                 
         STW,R10  RCDCB+2           STORE BUFFER ADDR IN DCB                    
         LW,R0    R11                                                           
         SLS,R0   1                                                             
         STH,R0   RCDCB+3           STORE RECORD SIZE                           
         STB,R15  *R10              CLOBBER ONE OF FIRST 4 BYTES                
*                                    FOR EOD PROCESSING.                        
         LW,R0    RCDCB             GET DCB WORD 0                              
         CW,R0    Y002              IS THE DCB OPEN                             
         BANZ     RCOOP12           YES, READ A RECORD                          
*   GET THE NEXT FILE                                                           
         PULL     2,R10             RESTORE BUFFER ADDRESS, SIZE                
         PUSH     2,R10             SAVE                                        
         BAL,R5   RCGETF            GET NEXT IS AREA FILE                       
         B        RCOOP25           ERROR, R9= TYC                              
         B        RCOOP23           NO MORE FILES, FIN SUPPLIED                 
*                                                                               
*   READ A FILE RECORD                                                          
*                                                                               
*   INITIALIZE SM:C WHICH MUST CONTAIN THE RFT INDEX OF THE                     
*   FILE CURRENTLY BEING USED AS THE C DEVICE.                                  
RCOOP10  RES      0                                                             
         LW,R0    RCDCB             GET READ DCB WORD 0                         
         CW,R0    Y002              IS IT OPEN                                  
         BANZ     RCOOP12           YES, BRANCH                                 
         LI,R9    RCOOP30           ERROR RETURN FOR OPEN                       
         CAL1,1   RCOPEN            NO, OPEN IT                                 
RCOOP12  RES      0                                                             
*   SET UP SYMBIONT C FILE INDEX (SM:C)                                         
         LI,R1    7                                                             
         LB,R1    RCDCB,R1          GET RFT INDEX                               
         STW,R1   SM:C              SET SYMBIONT FILE INDEX                     
*   SET UP SYMBIONT PRIORITY (SM:PRIO)                                          
         LB,R6    RFT8,R1           R6 = AREA INDEX                             
         LH,R6    MDNAME,R6                                                     
         AND,R6   M16               R6 = AREA NAME                              
         CI,R6    KIS               IS IT "IS" AREA                             
         BNE      RCOOP13           NO, BRANCH                                  
         LB,R6    RFT16,R1          YES, GET PRIORITY FROM RFT16                
         AND,R6   M4                (BITS 4-7)                                  
         STW,R6   SM:PRIO           STORE IT FOR RCJOB SUBROUTINE               
RCOOP13  RES      0                                                             
*   READ A RECORD FROM THE LOGICAL CARD READER                                  
         LI,R9    RCOOP30           ERROR RETURN FOR READ                       
         CAL1,1   RCFPT             READ                                        
         PULL     2,R6              GET BUFFER ADDRESS IN R6                    
         LW,R15   RCDCB+4           GET DCB WORD 4                              
         SLS,R15  -17               R15= POSTED ARS                             
         XW,R15   R7                R15= USER REC SIZE, R7= ARS                 
         PUSH     2,R6              PUT IT BACK                                 
*   BLANK FILL BUFFER SINCE COMPRESSED FILE READS ONLY                          
*   READS SPECIFIED NUMBER OF BYTES.                                            
         SW,R15   R7                DO WE NEED TO BLANK FILL                    
         BLEZ     RCOOP14           NO, BRANCH                                  
         AW,R6    R7                R6= 1ST BYTE TO BLANK FILL                  
         LI,R14   K40               BLANK CHARACTER                             
         STB,R14  0,R6              STORE                                       
         AI,R6    1                 ADDRESS OF NEXT BYTE TO BLANK FILL          
         BDR,R15  %-2               LOOP                                        
         PULL     2,R6              RESTORE BUFFER ADDRESS AND SIZE             
         PUSH     2,R6              SAVE                                        
RCOOP14  RES      0                                                             
         LB,R15   0,R6              GET FIRST BYTE                              
         CI,R15   '!'               IS IT A BANG                                
         BNE      RCOOP20           NO, CAN'T BE EXU COMMAND                    
         AI,R6    1                                                             
         LI,R4    R0*4              R4 CONTAINS DESTINATION (R0)                
         LI,R14   4                 NUMBER OF BYTES TO MOVE                     
         BAL,R9   MOVEBYTS                                                      
         CW,R0    XEXU              IS IT AN EXU COMMAND                        
         BNE      RCOOP15           NO, BRANCH                                  
*                                   YES, !EXU COMMAND                           
         PULL     2,R6              RESTORE BA, BC                              
         PUSH     2,R6              AND SAVE IT AGAIN                           
         BAL,R5   RCEXU             AND PROCESS EXU COMMAND                     
         B        RCOOP25           ERROR, R9= TYC                              
         B        RCOOP10           READ A USER FILE RECORD                     
*                                                                               
RCOOP15  RES      0                                                             
         CW,R0    XFIN              IS IT A FIN                                 
         BE       RCOOP12           YES, DISCARD                                
         CW,R0    XJOB              IS IT A JOB                                 
         BNE      RCOOP20           NO                                          
         BAL,R5   RCJOB             YES, APPEND JOB# TO CARD IMAGE              
         B        RCOOP12           B IF EXTRA JOB CARD FOUND                   
         PAGE                                                                   
*                                                                               
* NORMAL CARD READ                                                              
*                                                                               
RCOOP20  RES      0                                                             
         LI,R9    TYCNORM           SET NORMAL TYC                              
         PULL     2,R10             CLEANUP STACK                               
         B        SYM4X2P           TAKE NORMAL EXIT (+2)                       
*                                                                               
* NOT A BANG CARD                                                               
*                                                                               
RCOOP23  RES      0                                                             
         PULL     2,R10             CLEANUP STACK                               
         LI,R11   80                SET ACTUAL RECORD SIZE TO 80                
         LI,R9    TYCNORM           NORMAL TYPE COMPLETION                      
         B        SYM4X2P           TAKE NORMAL EXIT (+2)                       
*                                                                               
*                                                                               
*   COMMON ERROR EXIT: R9=ERROR CODE                                            
RCOOP25  RES      0                                                             
         PULL     2,R10             CLEANUP STACK                               
         B        SYM4X1P           TAKE ERROR EXIT (+1)                        
         PAGE                                                                   
*                                                                               
*   ERRORS FROM COOP FILE READ HERE                                             
*                                                                               
RCOOP30  RES      0                                                             
         LB,R9    R10               R9= ERROR CODE                              
         CI,R9    K5                IS IT AN EOD                                
         BNE      RCOOP32           NO, BRANCH                                  
         PULL     2,R10                                                         
         PUSH     2,R10                                                         
         BAL,R5   RCFEOD            PROCESS EOD                                 
         B        RCOOP25           +1...ERROR (R9=TYC)                         
         B        RCOOP23           +2...NO MORE FILES, FIN SUPPLIED            
         B        RCOOP10           +3...READ AGAIN                             
*                                                                               
RCOOP32  RES      0                                                             
         LI,R5    0                                                             
         STW,R5   SM:C              SET SYMBIONT C FILE TO ZERO                 
         CI,R9    TYC6A             DOES SYMB TASK HAVE IT OPEN                 
         BE       RCOOP32A          YES, BRANCH                                 
         CI,R9    K60               IS IT A BUSY FILE                           
         BNE      RCOOP34           NO, BRANCH                                  
*   CLOSE THE DCB                                                               
         LI,R9    RCOOP34           ERROR RETURN FOR CLOSE                      
         CAL1,1   RCLOSE                                                        
RCOOP32A RES      0                                                             
         LI,R9    RCOOP34           ERROR RETURN FOR STIMER CALL                
         CAL1,7   RCTIMER           WAIT FOR A FEW SECONDS                      
         B        RCOOP10           TRY READ AGAIN                              
*                                                                               
RCOOP34  RES      0                                                             
         LW,R9    RCDCB+2           GET DCB WORD 2                              
         SLS,R9   -17               R9= TYC                                     
         B        RCOOP25           TAKE COMMON ERROR EXIT                      
         TITLE    '** SYM4 - OUTPUT COOPERATIVE **'                             
*                                                                               
*   PROCESS OUTPUT REQUESTS TO A SYMBIONT DEDICATED DEVICE                      
*                                                                               
WCOOP    RES      0                                                             
         PUSH     R5                SAVE LINK                                   
         PUSH     2,R10             SAVE BUFFER ADDR, BYTE COUNT                
*   FORCE A VFC CHARACTER AT START OF USER'S BUFFER IF WRITE                    
*   IS WITH NO VFC BECAUSE ALL SYMBIONT WRITES TO LP ARE WITH VFC.              
         LW,R0    R4                R0= FUNCION CODE                            
         LI,R4    BA(WCBUF)         R4= COOP BUFFER ADDRESS                     
         LW,R6    R10               R6= BYTE ADDRESS OF USER BUFFER             
         LW,R14   R11               NUMBER OF BYTES IN USER BUFFER              
         CI,R0    FCWLPF            IS USER WRITING WITH FORMAT                 
         BE       WCOOP5            YES, BRANCH                                 
         LI,R0    X'40'             NO, INSERT A VFC CHARACTER                  
         STB,R0   0,R4              STORE IN WRITE BUFFER                       
         AI,R4    1                 INCR DESTINATION ADDR                       
         AI,R11   1                 INCR USER BYTE COUNT                        
WCOOP5   RES      0                                                             
         BAL,R9   MOVEBYTS          MOVE USER BUFFER TO COOP BUFFER             
         SLS,R11  1                                                             
         STH,R11  WCDCB+3           STORE USER'S RECORD SIZE                    
         LW,R0    WCDCB             GET DCB WORD 0                              
         CW,R0    Y002              IS THE WRITE DCB OPEN                       
         BANZ     WCOOP10           YES, BRANCH                                 
         BAL,R5   WCGETJOB          NO, DEFINE AN OUTPUT FILE                   
         B        WCOOP40           ERROR (R8,R10 SET AS USUAL)                 
         B        WCOOP20           B TO WRITE THE RECORD                       
*                                                                               
WCOOP10  RES      0                                                             
         LW,R12   WCDCB+5           YES, SEE IF SAME JOB IS RUNNING             
         LW,R13   WCDCB+6                                                       
         SLD,R12  -24                                                           
         LI,R4    3                 R4= # OF CHARACTERS TO CONVERT              
         BAL,R8   SMBCDHEX          CONVERT THE NUMBER TO BINARY IN R14         
         CW,R14   JOB#              IS THE SAME AS THE RUNNING JOB              
         BE       WCOOP20           YES, BRANCH                                 
*   CLEANUP ANY INPUT FILES FOR THIS JOB WHICH MAY BE LEFTOVER.                 
         BAL,R5   RCCUPJ            CLEANUP SUBROUTINE                          
         B        WCOOP45           ERROR                                       
         BAL,R5   WCGETJOB          NO, DEFINE A NEW OUTPUT FILE                
         B        WCOOP40           R8 AND R10 SET AS USUAL                     
         BAL,R8   SIMIKEY           SIMULATE SLPNDD,I FOR ALL LP'S              
         LI,R9    WCOOP45           ERROR RETURN FOR START CALL                 
         CAL1,7   WCSTART           START SYMBIONT TASK                         
WCOOP20  RES      0                                                             
         LI,R9    WCOOP40           ERROR RETURN FOR WRITE CALL                 
         CAL1,1   WCFPT             WRITE CALL                                  
         LI,R6    BA(WCBUF)+1       BYTE ADDR OF 1ST CHAR PAST VFC              
         LB,R0    0,R6              GET 1ST BYTE OF USER'S BUFFER               
         CI,R0    '!'               IS IT A CONTROL COMMAND                     
         BNE      WCOOP30           NO, BRANCH                                  
         AI,R6    1                 YES, GET CMD AND TEST FOR FIN               
         LI,R4    R8*4              MOVE TO R8                                  
         LI,R14   4                 # OF BYTES TO MOVE                          
         BAL,R9   MOVEBYTS          MOVE                                        
         CW,R8    XFIN              IS IT A FIN                                 
         BNE      WCOOP30           NO, DONE                                    
         MTW,0    K:JCP1            IS JCP EXECUTING                            
         BGEZ     WCOOP30           NO, NOT REAL FIN                            
*   CLEANUP IS AREA FILES IF ANY.                                               
         BAL,R5   RCCUPF            CLEANUP ROUTINE                             
         B        WCOOP45           ERROR, R8 AND R10 STD ERR REGS              
*   CLOSE THE CURRENT SYMBIONT FILE                                             
         LI,R14   WCDCB             ADDRESS OF DCB TO CLOSE                     
         LI,R9    WCOOP45           ERROR RETURN FOR CLOSE                      
         CAL1,1   FPTCLOS           CLOSE THE FILE                              
         BAL,R8   SIMIKEY           SIMULATE SYYNDD,I KEYIN                     
         LI,R9    WCOOP45           ERROR RETURN FOR START                      
         CAL1,7   WCSTART           START SYMBIONT TASK                         
WCOOP30  RES      0                                                             
         LI,R9    TYCNORM           NORMAL TYC                                  
         PULL     2,R10             RESTORE R10, R11                            
         B        SYM4X2P           TAKE NORMAL EXIT                            
*                                                                               
*                                                                               
WCOOP40  RES      0                                                             
         LB,R9    R10               R9= ERROR                                   
         CI,R9    TYC72             IS IT AREA OVERFLOW                         
         BNE      WCOOP50           NO                                          
         BAL,R5   WCSTSYM           NOTIFY SYMBIONT ABOUT OVERFLOW              
         B        WCOOP45           ERROR                                       
         B        WCOOP20           TRY THE WRITE AGAIN                         
*                                                                               
WCOOP45  RES      0                                                             
         LB,R9    R10               R9= LATEST ERROR CODE                       
WCOOP50  RES      0                                                             
         PULL     2,R10             TAKE ERROR EXIT TO BKGD                     
         B        SYM4X1P           TAKE ERROR EXIT                             
         TITLE    '** SYM4 - SMHEXBCD SUBROUTINE **'                            
************                                                                    
*  SMHEXBCD *                                                                   
************                                                                    
*                                                                               
*   SUBROUTINE TO CONVERT A HEXADECIMAL NUMBER TO EBCDIC                        
*                                                                               
*        BAL,R8   SMHEXBCD                                                      
*                                                                               
*   WHERE R13= VALUE TO CONVERT, RIGHT JUSTIFIED                                
*                                                                               
*   AT EXIT:  R12,R13 CONTAIN CONVERTED NUMBER,RIGHT JUSTIFIED                  
*                                                                               
SMHEXBCD RES      0                                                             
         LI,R4    -8                SET NUMBER OF DIGITS TO CONVERT             
         LW,R15   R13               COPY THE INPUT NUMBER, FREE R13             
*                                                                               
HEXBCD1  RES      0         EXTRACT AND CONVERT 1 DIGIT                         
         SCS,R15  4                 SHIFT MOST SIGNIFICANT DIGIT TO             
         LW,R0    R15               LEAST SIGNIFICANT, COPY TO                  
         AND,R0   M4                EXTRACT NEXT DIGIT OUT                      
         AI,R0    X'F0'             CONVERT TO EBCDIC                           
         CI,R0    X'FA'             IS IT AN 'A-F' DIGIT ?                      
         BL       %+2                 NO, 0-9, SO OK AS IS                      
         AI,R0    -X'39'            CONVERT TO 'A' TO 'F' DIGIT                 
         STB,R0   R14,R4            STORE THE DIGIT IN RESULT REGISTERS         
         BIR,R4   HEXBCD1           AND LOOP FOR NEXT DIGIT                     
*                                                                               
HEXBCDX  B        *R8       NUMBER CONVERTED: EXIT                              
         TITLE    '** SYM4 - SMBCDHEX SUBROUTINE **'                            
************                                                                    
*  SMBCDHEX *                                                                   
************                                                                    
*                                                                               
*   ROUTINE CONVERTS A NUMBER IN EBCDIC TO HEXA DECIMAL (BINARY)                
*                                                                               
*        BAL,R8   SMBCDHEX                                                      
*                                                                               
*   WHERE R12,R13 CONTAIN THE NUMBER    TO CONVERT                              
*         R4      CONTAINS THE NUMBER OF CHARACTERS TO CONVERT                  
*                                                                               
*   AT EXIT:  R14 CONTAINS CONVERTED NUMBER,    RIGHT JUSTIFIED.                
*                                                                               
*   ROUTINE DESTROYS R0,R4                                                      
*                                                                               
SMBCDHEX RES      0                                                             
         LCW,R4   R4                                                            
         LI,R14   0                                                             
BCDHEX1  RES      0                                                             
         LB,R0    R14,R4            FETCH NEXT CHARACTER                        
         CI,R0    X'F0'                                                         
         BGE      %+2                                                           
         AI,R0    X'39'                                                         
         AI,R0    -X'F0'            R1= CHARACTER IN HEX                        
         SLS,R14  4                 MAKE ROOM FOR NEXT DIGIT                    
         OR,R14   R0                ADD IT IN                                   
         BIR,R4   BCDHEX1           GET NEXT DIGIT IF MORE TO DO                
BCDHEXX  B        *R8               EXIT                                        
         OLAYEND                                                                
         FIN      #SYMB                                                         
         END                                                                    
