*I/O ROUTINES & RELATED DATA                            HEADER  FUPIO2  0001.000
         M.PGM     FUP.IO2,MPX-32,3.6.1,00                              0002.000
         SPACE                                                          0003.000
************************************************************************0004.000
*                                                                      *0005.000
*                    PROPRIETARY INFORMATION                           *0006.000
*                    -----------------------                           *0007.000
*   THE INFORMATION CONTAINED HEREIN IS PROPRIETARY TO ENCORE          *0008.000
*   COMPUTER CORPORATION AND/OR ITS VENDORS, AND ITS USE, DISCLOSURE,  *0009.000
*   OR DUPLICATION IS SUBJECT TO THE RESTRICTIONS STATED IN THE        *0010.000
*   STANDARD ENCORE COMPUTER CORPORATION LICENSE TERMS AND CONDITIONS  *0011.000
*   OR THE APPROPRIATE THIRD-PARTY SUBLICENSE AGREEMENT.               *0012.000
*                                                                      *0013.000
*                       RESTRICTED RIGHTS                              *0014.000
*                       -----------------                              *0015.000
*   USE, DUPLICATION, OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT       *0016.000
*   TO RESTRICTIONS AS SET FOURTH IN SUBDIVISION (c) (1) (ii) OF       *0017.000
*   THE RIGHTS IN TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT       *0018.000
*   252.227.7013                                                       *0019.000
************************************************************************0020.000
* (C) COPYRIGHT 1989 ENCORE COMPUTER CORPORATION                       *0021.000
*     ALL RIGHTS RESERVED                                              *0022.000
************************************************************************0023.000
*                                                                       0024.000
*    FUNCTIONAL DESCRIPTION:                                            0025.000
*                                                                       0026.000
*        THIS MODULE CONTAINS I/O RELATED ROUTINES AND DATA             0027.000
*        FOR MPX 2.0                                                    0028.000
*                                                                       0029.000
         SPACE                                                          0030.000
*                                                                       0031.000
         SPACE                                                          0032.000
*                                                                       0033.000
*        EXTERNAL REFERENCES                                            0034.000
*                                                                       0035.000
         SPACE                                                          0036.000
         EXT       ADR.MASK        TO CLEAR CC'S LEAVING ADDRESS        0037.000
         EXT       CC.MASK         TO CLEAR ADDRESS AND LEAVE CC'S      0038.000
         EXT       M.WRIT          WRITE ROUTINE                        0039.000
         EXT       M.READ          READ ROUTINE                         0040.000
         EXT       IO2BUFF         SCRATCH FILE 2 BUFFER                0041.000
         EXT       TAPBUFF         TAPE I/O BUFFER                      0042.000
         SPACE                                                          0043.000
*                                                                       0044.000
*    EXTERNAL DEFINITIONS:                                              0045.000
*                                                                       0046.000
         DEF       DISCFCB         FCB FOR R/W DISC FILES               0047.000
         DEF       TAPFCB          FCB FOR TAPE I/O                     0048.000
         DEF       INPFCB          FCB FOR FILE INPUT                   0049.000
         DEF       LOGFCB          FCB FOR LOG LISTING                  0050.000
         DEF       ALCFCB          FCB FOR ALLOCATION TEST     84-0835  0051.000
         DEF       DSCZ            G STRING FOR DSC LFC                 0052.000
         DEF       INPZ            G STRING FOR COPY FCB                0053.000
         DEF       TAPZ            G STRING FOR TAP LFC                 0054.000
         DEF       LOGZ            G STRING FOR LOG FCB                 0055.000
         DEF       RSEQ                                                 0056.000
         DEF       WSEQ                                                 0057.000
         DEF       RRAN                                                 0058.000
         DEF       WRAN                                                 0059.000
*                                                                       0060.000
         DEF       INITIO2         RESET POINTERS TO IO2BUFF            0061.000
         DEF       NEXTIO2         IO2BUFF POINTER                      0062.000
         DEF       LASTIO2         IO2BUFF POINTER                      0063.000
*                                                                       0064.000
         DEF       INITTAP         RESTE POINTERS TO TAPBUFF            0065.000
         DEF       NEXTTAP         TAPBUFF POINTER                      0066.000
         DEF       LASTTAP         TAPBUFF POINTER                      0067.000
*                                                                       0068.000
         DEF       FLAGWORD        GENERAL WORD FOR ANYONE              0069.000
*                                                                       0070.000
*    SYSTEM MACRO CALLS FOR REGISTER EQUATES                            0071.000
*                                                                       0072.000
         LIST      NOMAC                                                0073.000
         M.REQS                                                         0074.000
         M.FCB.                                                         0075.000
*                                                                       0076.000
*    GLOBAL DATA DECLARATIONS                                           0077.000
*                                                                       0078.000
DISCFCB  DATAW     G'DSC'          FCB FOR DISC I/O                     0079.000
         DATAW     0                                                00070080.000
         DATAW     X'22000000'     DFI,EXPANDED FCB                 00070081.000
         REZ       13W                                              00070082.000
*                                                                       0083.000
INPFCB   DATAW     G'INP'          FCB FOR COPY I/O                     0084.000
         DATAW     0                                                00070085.000
         DATAW     X'22000000'     DFI,EXPANDED FCB                 00070086.000
         REZ       13W                                              00070087.000
*                                                                       0088.000
TAPFCB   DATAW     G'TAP'          FCB FOR TAPE I/O                     0089.000
         DATAW     0                                                00070090.000
         DATAW     X'02000000'        ,EXPANDED FCB                 00080091.000
         REZ       13W                                              00070092.000
*                                                                       0093.000
LOGFCB   DATAW     G'LOG'          FCB FOR LOG TO FILE                  0094.000
         REZ       15W                                                  0095.000
*                                                                       0096.000
ALCFCB   DATAW     G'ALC'          FCB FOR ALLOCATION TEST     84-0835  0097.000
         DATAW     0                                           84-0835  0098.000
         DATAW     X'02000000'        ,EXPANDED FCB            84-0835  0099.000
         REZ       13W                                         84-0835  0100.000
*                                                                       0101.000
NEXTIO2  RES       1W              NEXT SLOT IN IO2BUFF                 0102.000
LASTIO2  RES       1W              LAST SLOT IN IO2BUFF                 0103.000
*                                                                       0104.000
NEXTTAP  RES       1W              NEXT SLOT IN TAPBUFF                 0105.000
LASTTAP  RES       1W              LAST SLOT IN TAPBUFF                 0106.000
*                                                                       0107.000
FLAGWORD RES       1W              GENERAL FLAGWORD                     0108.000
*                                                                       0109.000
DSCZ     DATAW     G'DSC'          G STRING FOR DSC LFC                 0110.000
INPZ     DATAW     G'INP'          G STRING FOR COPY LFC                0111.000
TAPZ     DATAW     G'TAP'          G STRING FOR TAP LFC                 0112.000
LOGZ     DATAW     G'LOG'          G STRING FOR LOG LFC                 0113.000
*    LOCAL DATA DECLARATIONS                                            0114.000
*                                                                       0115.000
         TITLE READ/WRITE THE GIVEN FCB                                 0116.000
         SPACE                                                          0117.000
         CSECT                                                          0118.000
         SPACE                                                          0119.000
*                                                                       0120.000
* THIS ROUTINE IS USED TO DO A GENERAL READ OR WRITE FROM               0121.000
* OR TO A FILE OR DEVICE.                                               0122.000
*                                                                       0123.000
* IT HAS FOUR ENTRY POINTS:                                             0124.000
*        (1) RRAN - READ RANDOM (BUT ALLOWS IOCS TO TRACK BLOCK NUMBERS)0125.000
*        (2) WRAN - WRITE RANDOM(     "     "     "     "     "     "  )0126.000
*        (3) RSEQ - READ SEQUENTIALLY                                   0127.000
*        (4) WSEQ - WRITE SEQUENTIALLY                                  0128.000
*                                                                       0129.000
* INPUTS:                                                               0130.000
*        R2 = ADDRESS OF THE FCB                                        0131.000
*        R6 = ADDRESS OF THE BUFFER TO TRANSFER TO/FROM                 0132.000
*        R7 = NUMBER OF BLOCKS TO TRANSFER                              0133.000
*          OR                                                           0134.000
*        R7 = NUMBER OF BYTES TO TRANSFER + BIT 0 SET                   0135.000
*                                                                       0136.000
* OUTPUTS:                                                              0137.000
*        CC1 IS SET IF EOF OR EOM                                       0138.000
*        CC2 IS SET IF AN I/O ERROR IS DETECTED                         0139.000
*        R7 = THE NUMBER OF BYTES/BLOCKS TRANSFERRED IF ALL IS O.K.     0140.000
*                                                                       0141.000
RSEQ     EQU       $               READ ENTRY POINT                     0142.000
         ANMW      R0,ADR.MASK     CLEAR CC'S                           0143.000
         PUSH                      SAVE REGISTERS                       0144.000
         LA        R3,M.READ       READ ROUTINE ADDRESS                 0145.000
         ZBM       4,FCB.GCFG,R2   CLEAR RANDOM ACCESS MODE INDICATOR   0146.000
         BU        RWCOM           COMMON CODE WITH WRITE               0147.000
*                                                                       0148.000
WSEQ     EQU       $               WRITE ENTRY POINT                    0149.000
         ANMW      R0,ADR.MASK     CLEAR CC'S                           0150.000
         PUSH                      SAVE REGISTERS                       0151.000
         LA        R3,M.WRIT       WRITE ROUTINE ADDRESS                0152.000
         ZBM       4,FCB.GCFG,R2   CLEAR RANDOM ACCESS MODE INDICATOR   0153.000
         BU        RWCOM           COMMON CODE WITH WRITE               0154.000
*                                                                       0155.000
RRAN     EQU       $               READ RANDOM ENTRY POINT              0156.000
         ANMW      R0,ADR.MASK     CLEAR CC'S                           0157.000
         PUSH                      SAVE REGISTERS                       0158.000
         LA        R3,M.READ       READ ROUTINE ADDRESS                 0159.000
         SBM       4,FCB.GCFG,R2   SET RANDOM ACCESS                    0160.000
         BU        RWCOM           COMMON CODE WITH WRITE               0161.000
*                                                                       0162.000
WRAN     EQU       $               WRITE RANDOM ENTRY POINT             0163.000
         ANMW      R0,ADR.MASK     CLEAR CC'S                           0164.000
         PUSH                      SAVE REGISTERS                       0165.000
         LA        R3,M.WRIT       WRITE ROUTINE ADDRESS                0166.000
         SBM       4,FCB.GCFG,R2   SET RANDOM ACCESS                    0167.000
*                                                                       0168.000
*                                                                       0169.000
* COMMON CODE TO EXECUTE THE I/O                                        0170.000
*                                                                       0171.000
RWCOM    EQU       $                                                    0172.000
         SBM       6,FCB.GCFG,R2   USE EXPANDED FCB                     0173.000
         STW       R6,FCB.ERWA,R2  BUFFER TO USE FOR I/O                0174.000
         ZBR       R7,0            CHECK FOR BYTE XFER                  0175.000
         BS        RWCOM2          BRANCH IF BYTE XFER                  0176.000
         MPI       R6,BLOCKSIZ*4   NUMBER OF BYTES TO TRANSFER          0177.000
RWCOM2   STW       R7,FCB.EQTY,R2  INTO THE FCB                         0178.000
         TRR       R7,R5           SAVE FOR AFTER THE I/O               0179.000
         BL        0,R3            EXECUTE THE I/O ROUTINE              0180.000
         BS        RWCOM1          SKIP TRANSFER COUNT CHECK IF EOF/EOM 0181.000
*                                                                       0182.000
* I/O COMPLETED SO CHECK THE TRANSFER COUNT                             0183.000
*                                                                       0184.000
         LW        R7,FCB.RECL,R2  ACTUAL BYTES TRANSFERRED             0185.000
         SUR       R7,R5           R5 = REQUESTED - TRANSFERRED         0186.000
         BLT       RWERR           BRANCH IF TRANSFER > REQUEST         0187.000
*                                                                       0188.000
         TBM       0,7W,R1         SEE IF INPUT WAS BYTE XFER           0189.000
         BS        RWCOM3          BRANCH IF SO                         0190.000
         ZR        R6              GET NUMBER OF BLOCKS.....            0191.000
         DVI       R6,BLOCKSIZ*4   ..... AND ALSO CHECK .....           0192.000
         TRR       R6,R6           ..... FOR ILLEGAL REMAINDER          0193.000
         BNZ       RWERR           BRANCH IF REMAINDER                  0194.000
*                                                                       0195.000
RWCOM3   STW       R7,7W,R1        RETURN BYTES/BLOCKS TO CALLER        0196.000
*                                                                       0197.000
*        PASS ALONG CONDITION CODES RETURNED FROM I/O ROUTINE           0198.000
*                                                                       0199.000
RWCOM1   ANMW      R0,CC.MASK      CLEAR ADDRESS PART LEAVING CC'S      0200.000
         ORMW      R0,0W,X1        MERGE WITH RETURN ADDRESS ON STACK   0201.000
         STW       R0,0W,X1        PLANT BACK ON STACK                  0202.000
         POP                                                            0203.000
         TRSW      R0                                                   0204.000
*                                                                       0205.000
* AN ERROR HAS BEEN DETECTED EITHER BY THE I/O ROUTINE OR               0206.000
* BY A BAD NUMBER OF BYTES HAVING BEEN TRANSFERRED.                     0207.000
* SET CC2 AND EXIT                                                      0208.000
*                                                                       0209.000
RWERR    EQU       $                                                    0210.000
         SPACE                                                          0211.000
*                                                                       0212.000
* WORK-AROUND NEEDED FOR "E"-CLASS TAPE HANDLER PROBLEM.  WHEN WRITE    0213.000
* TO TAPE IS RETRIED TO FIX CORRECTABLE DATA ERROR(S) WRONG VALUE GETS  0214.000
* PROPAGATED TO "FCB.RECL" (IE., THE ACTUAL # BYTES TRANSFERED)         0215.000
*                                                                       0216.000
* IF IOCS FUNCTION CODE SAYS WRITE, THEN DO NOT MARK ERROR BECAUSE      0217.000
* "FCB.RECL" .NE. "FCB.EQTY"                                            0218.000
*                                                                       0219.000
         LI        R4,3            IOCS OPCODE FOR WRITE                0220.000
         CAMB      R4,0B,X2        CHECK OPCODE IN FCB                  0221.000
         BEQ       RWCOM1          GO FOR OPERATION IS WRITE            0222.000
         SPACE                                                          0223.000
         SBM       CC2,0W,R1                                            0224.000
         BU        RWCOM1                                               0225.000
         TITLE     INITIALISE IO2BUFF POINTERS                          0226.000
*                                                                       0227.000
* THIS ROUTINE IS USED TO REINITIALISE THE BUFFER POINTERS              0228.000
* FOR THE SCRATCH FILE BUFFER IO2BUFF USED IN THE SAVE AND              0229.000
* RESTORE COMMANDS.                                                     0230.000
*                                                                       0231.000
* INPUTS:                                                               0232.000
*        R7 = SIZE OF AN ENTRY FOR CURRENT BUFFER USAGE                 0233.000
*                                                                       0234.000
* OUTPUTS:                                                              0235.000
*        NONE                                                           0236.000
*                                                                       0237.000
INITIO2  PUSH                      SAVE REGISTERS                       0238.000
         LA        R6,IO2BUFF                                           0239.000
         STW       R6,NEXTIO2      FIRST FREE ENTRY                     0240.000
*                                                                       0241.000
         ADI       R6,IO2MXIDX     SIZE OF BUFFER                       0242.000
         SUR       R7,R6                                                0243.000
         STW       R6,LASTIO2      LAST POSSIBLE ENTRY SLOT             0244.000
         POP                       RESTORE REGISTERS                    0245.000
         TRSW      R0                                                   0246.000
         TITLE     INITIALISE TAPBUFF POINTERS                          0247.000
*                                                                       0248.000
* THIS ROUTINE IS USED TO REINITIALISE THE BUFFER POINTERS              0249.000
* FOR THE TAPE BUFFER USED IN THE SAVE, RESTORE AND LOG COMMANDS        0250.000
*                                                                       0251.000
*                                                                       0252.000
* INPUTS:                                                               0253.000
*        R7 = SIZE OF AN ENTRY FOR CURRENT BUFFER USAGE                 0254.000
*                                                                       0255.000
* OUTPUTS:                                                              0256.000
*        NONE                                                           0257.000
*                                                                       0258.000
INITTAP  PUSH                      SAVE REGISTERS                       0259.000
         LA        R6,TAPBUFF                                           0260.000
         STW       R6,NEXTTAP      FIRST FREE ENTRY                     0261.000
*                                                                       0262.000
         ADI       R6,TAPMXIDX     SIZE OF BUFFER                       0263.000
         SUR       R7,R6                                                0264.000
         STW       R6,LASTTAP      LAST POSSIBLE ENTRY SLOT             0265.000
         POP                       RESTORE REGISTERS                    0266.000
         TRSW      R0                                                   0267.000
         END                                                            0268.000
