*COMDECK COMIOQ 
IO.       TITLE  IO. -- INPUT/OUTPUT FET PROCESSING SUBROUTINE
**
*     IO. -- IO PROCESSING SUBROUTINE 
* 
*     IO. PROVIDES OWNCODE PROCESSING WITHOUT CPC.
*     THE ASSOCIATED MACROS (IN COMDECK MACIOQ) 
*     PROVIDE THE INTERFACE BETWEEN THE USER PROGRAM AND
*     IO.  A MACRO *WAIT* WILL PROVIDE RECALL CAPABILITIES
*     WITH OWNCODE EXITS. 
* 
*     THE MACROS EXPAND INTO: 
* 
*         SB2    LFN
*         RJ     IO.
* 
**T   15/0,1/A,1/B,1/C,1/ ,1/R,22/ COUNT ,4/LEV,14/CODE 
* 
*     WHERE A = IN EQUALS OUT AT REQUEST COMPLETE.
*           B = CALL CIO (NOT *WAIT*) 
*           C = 0 IMPLIES THIS MAY BE A CONTINUATION CALL 
*           R = RECALL
* 
*     IO. CONSISTS OF 3 MAJOR SUBROUTINES, IO. - THE MAIN 
*     CONTROL LOOP, IO.100 - THE RETURN STATUS CHECKER, AND 
*     IO.200 - THE CIO CALL SETUP ROUTINE.
* 
*     LOGIC FLOW
*     IF B IS SET IN THE CALL IO.100 IS EXECUTED TO CHECK 
*     COMPLETION AND EXIT ON ERROR THROUGH OWNCODE. 
*     THE REQUEST IS THEN ISSUED AND IO.100 IS EXECUTED 
*     IF THE R BIT IS SET.  IO. IS EXITED.
* 
*     IF B IS NOT SET THE COMPLETE BIT IS TESTED.  IF NOT 
*     SET THE CODE IN THE CALL IS COMPARED WITH THE FET.  IF
*     THEY ARE EQUAL THEN RECALL IS CHECKED.  IF THE COMPLETE 
*     BIT IS SET IO.100 IS EXECUTED IN CASE OF ERRORS.
*     THE REQUEST IS EXAMINED FOR *READ*.  IF IT WAS A
*     *READ* AND EOR/EOF EXISTS IO. EXITS.  IF NOT *READ* 
*     OR IF READ BUT NOT EOR/EOF CHECK BUFFER FOR ENOUGH
*     ROOM FOR AT LEAST 1 PRU.  IO. EXITS IF NOT ENOUGH 
*     ROOM (OR DATA FOR WRITE TYPE CODES).  IF ENOUGH 
*     ROOM THE CIO CALL IS ISSUED AND IO.100 IS CALLED
*     IF THE REQUEST WAS WITH RECALL. 
* 
*     BECAUSE ERRORS (EOI) CAN BE DETECTED BEFORE OR AFTER
*     THE CIO CALL IS ISSUED, IO. SETS THE OWNCODE RETURN 
*     TO THE START OF THE IO. CALL IF THE ERROR WAS DETECTED
*     BEFORE THE CIO REQUEST IS ISSUED.  IF THE ERROR IS
*     DETECTED AFTER THE CIO REQUEST IS ISSUED THE *A* BIT
*     IS TESTED IN THE CALL.  IF SET IN MUST EQUAL OUT FOR
*     THE REQUEST TO BE COMPLETE.  IF THE BIT IS NOT SET, 
*     OR IF SET AND IN = OUT, IO. SETS OWNCODE S EXIT TO
*     THE NORMAL EXIT.  IF NOT THEN THE EXIT IS SET TO
*     THE START OF THE IO. CALL.
* 
IO.A      VFD    60/0 
IO.B      VFD    60/0 
IO.C      VFD    60/0 
IO.D      VFD    60/0 
  
IO.XJ     BSSZ   20B
  
IO.0      SYSTEM  XJR,R,IO.XJ 
  
IO.       EQ   *+4S15 
  
  
          SX1    A6          SAVE X6,X2,A6,A1 WHICH SYSTEM USES 
          SA6    IO.B 
          BX6    X2 
          SA6    IO.A 
          BX6    X1 
          SA6    IO.C 
          SX6    A1 
          SA6    IO.D 
          SYSTEM  XJR,R,IO.XJ,1    SAVE XJ PACKAGE
  
          SB1    1
          SA1    IO.B        PUT BACK X6,X2,A6,A1 
          BX6    X1 
          SA6    IO.XJ+16B
          SA1    IO.A 
          BX6    X1 
          SA6    IO.XJ+12B
          SA1    IO.C 
          MX0    18 
          LX0    36 
          LX1    18 
          BX6    X0*X1
          SA1    IO.XJ+6
          BX1    -X0*X1 
          BX6    X6+X1
          SA6    A1 
          SA1    IO.D 
          LX1    18 
          BX6    X0*X1
          SA1    IO.XJ+1
          BX1    -X0*X1 
          BX6    X6+X1
          SA6    A1 
          SX6    B0          CLEAR X1 
          SA6    IO.XJ+11B
          SA1    IO.XJ+0     SET P IN XJ PACKAGE
          SX6    IO.
          LX0    18 
          LX6    36 
          BX1    -X0*X1 
          BX6    X1+X6
          SA6    A1 
  
          SB3    2           EXIT TO IO. CALL IF OWNCODE
*                            BEFORE REQUEST COMPLETED.
          SA2    IO.         PICK UP CALL POINTER 
          LX2    30          FIX CORRECT EXIT 
          SX6    B1 
          IX6    X2+X6
          LX6    30 
          SA6    A2 
          SA2    X2          PICK UP CALL ITSELF
          LX2    17 
          PL   X2,IO.10      POSSIBLE CONTINUATION, DO NOT QUIT 
          RJ   IO.100 
IO.10     SA2    A2          PICK UP BITS 43-59 FROM CALL 
          MX3    17 
          BX3    X2*X3
          ZR   X3,IO.0       WAIT CALL, ALL DONE
  
          BX3    X2 
          LX3    17 
          MI   X3,IO.60      NOT A POSSIBLE CONTINUATION, ISSUE 
  
          SA1    B2 
          LX1    59 
          NG   X1,IO.20      BUFFER NOT BUSY
          SX0    774B 
          LX1    1
          BX3    X2-X1
          BX3    X0*X3
          ZR   X3,IO.70      SAME CIO CODE, DONT REISSUE
  
IO.20     RJ   IO.100        NOT BUSY OR BUSY WITH ANOTHER FUNCTION 
          SA2    A2 
          SX1    4B 
          BX1    X1*X2
          NZ   X1,IO.30      WRITE TYPE CONTINUATION
          BX2    X0*X2
          SX1    10B
          BX1    X1-X2
          ZR   X1,IO.25      NOT READ, DONT STOP FOR EOF/EOR
          SA1    B2 
          SX2    60B
          BX2    X1*X2
          SX1    20B
          BX2    X2-X1
          ZR   X2,IO.0       EOR/EOF   DONT READ
  
IO.25     SA3    B2+2        IN READ
          SA4    A3+B1       OUT
          SX3    X3+B1
          EQ   IO.40
  
IO.30     SA4    B2+2        IN WRITE 
          SA3    A4+B1       OUT
IO.40     IX6    X4-X3
          SA4    B2+4        LIMIT
          PL   X6,IO.50 
          SA3    B2+B1       FIRST
          SX3    X3 
          SX4    X4 
          IX3    X4-X3
          SA4    A4 
          IX6    X6+X3
IO.50     LX4    27 
          AX4    45          GET PRU LENGTH 
          SA2    A2 
          SX1    570B 
          BX1    X1*X2
          NZ   X1,IO.55      NOT READC/WRITEC CODE
          SX4    X4+B1       INCLUDE HEADER WORD IN PRU SIZE
IO.55     IX3    X6-X4
          NG   X3,IO.0       NOT ROOM FOR 1 PRU 
  
IO.60     RJ   IO.200        ISSUE REQUEST
IO.70     SA2    A2 
          LX2    19 
          PL   X2,IO.0       NOT A REQUEST WITH RECALL, DONE
          LX2    -4 
          PL   X2,IO.80      IN/OUT NOT INDICATION OF COMPLETE
          SX2    B2 
          RJ   =XWNB= 
          SA3    B2+2        IN 
          SA4    A3+B1       OUT
          BX3    X3-X4
          NZ   X3,IO.90      IN NOT EQUAL OUT, NOT COMPLETED
IO.80     SB3    B0 
IO.90     RJ   IO.100 
          EQ   IO.0          DONE 
IO.100    EJECT    4,6
**
*     IO.100 -- IO. S OWNCODE PROCESSOR.
* 
*     IO.100 ALWAYS CHECK FOR COMPLETE BEFORE BEGINNING.
*     IF ERROR EXIT EXISTS AND AN ERROR IS DETECTED, IO.100 
*     EXITS TO THE OWNCODE ROUTINE.  IF EOI EXIT EXISTS AND 
*     EOI (EOV ETC.) IS DETECTED, IO.100 EXITS TO THE OWNCODE 
*     ROUTINE.  IF ERROR OR EOI CONDITION EXISTS BUT THE
*     EXITS DO NOT, IO.100 EXITS WITHOUT CHANGING THE STATUS
*     IN THE FET.  IF AN OWNCODE EXIT IS TAKEN THE ERROR
*     (OR EOI) CONDITION IS CLEARED IN THE FET HOWEVER X1 
*     CONTAINS THE ORIGINAL CONTENTS OF FET(0)
* 
IO.100    EQ   *+4S15 
          SX2    B2          FET ADDRESS
          RJ   =XWNB=        WAIT 
          SA1    B2 
          LX1    -9 
          MX0    55 
          BX0    -X0*X1      EXTRACT BITS 9-13
          ZR   X0,IO.100     NO ERROR OR EOI FLAGS
          LX1    9
          BX6    X1 
          SA6    IO.XJ+11B   SET X1 IN XJ PACKAGE TO FET(0) 
          SA1    B2+B1
          LX1    36 
          AX1    54 
          SX6    X1-4        LENGTH OF FET-9
          NG   X6,IO.100     NO OWNCODE 
          SA1    B2+8        OWNCODE WORD 
          BX6    X1 
          LX6    30 
          SX1    X1          NOW = ERROR ADDRESS
          SX6    X6          NOW = EOI ADDRESS
          SX2    37000B      MASK IF ERROR ONLY 
          SX0    X0-20B 
          PL   X0,IO.130     ERROR ONLY 
  
          SX0    X0+14B 
          NG   X0,IO.110     EOI ONLY 
                             ERROR, MAYBE ALSO EOI
          SX2    14000B      MASK FOR ERRORS
          NZ   X1,IO.140     ERROR OWNCODE PRESENT
  
          MX5    58 
          SX0    X0+4        RESTORE FLAG BITS IN X0
          BX5    -X5*X0 
          ZR   X5,IO.100     NO EOI FLAG
  
IO.110    ZR   X6,IO.100     NO EOI OWNCODE 
SC46347   IF     DEF,QDMP$                                              012130
          BX0    X6                SAVE X6                              012140
          SA1    REST              GET RUN TYPE                         012150
          ZR   X1,IO.112           IF DMPQ RUN                          012160
          SA1    B2                FET+0                                012170
          SX2    16B                                                    012180
          BX1    X1*X2             MASK OUT CODE                        012190
          SX2    12B               READ CODE                            012200
IO.111    IX1    X1-X2                                                  012210
          NZ   X1,IO.113           IF NOT TAPE                          012220
          SA1    B2                FET+0                                012230
          LX1    -9                SHIFT ERROR CODE LOW                 012240
          MX2    -5                                                     012250
          BX1    -X2*X1            MASK OUT CODE                        012260
          SX1    X1-2              TEST FOR 02 CODE                     012270
          ZR   X1,IO.100           EXIT IF EOV                          012280
          EQ   IO.113              ELSE PROCESS ERROR                   012290
                                                                        012300
IO.112    SA1    B2                FET+0                                012310
          SX2    16B               WRITE CODE                           012320
          BX1    X1*X2                                                  012330
          EQ   IO.111              FINISH TEST                          012340
                                                                        012350
IO.113    BSS    0                                                      012360
          BX6    X0                RESTORE C6                           012370
                                                                        012380
SC46347   ENDIF                                                         012390
          SX1    X6 
          SX2    3000B       MASK FOR EOI FLAGS 
          EQ   IO.140 
  
IO.130    ZR   X1,IO.100     NO ERROR OWNCODE 
  
IO.140    SX0    X1 
          SA1    B2 
          BX6    -X2*X1 
          SA6    A1          DELETE ERROR FLAGS IN FET IF OWNCODE 
          SX6    B1 
          LX6    26 
          BX6    X6+X0
          SX1    B1 
          IX6    X6+X1
          LX6    30 
          SA1    IO.
          SA6    A1          PUT BRANCH TO OWN CODE IN CPC
          SX6    B3          PICK UP RETURN OFF SET, 2=CALL,0=NORMAL
          LX6    30 
          IX6    X1-X6
          SA6    X0          MOVE EXIT FROM CPC TO OWNCODE
          EQ   IO.0          STRAIGHT OUT IO. 
IO.200    EJECT    4,6
**
*     IO.200 -- IO. S CIO CALLER
* 
*     IO.200 SETS UP THE FET AND THE CIO INPUT REGISTER FROM
*     THE IO. CALL AND ISSUES THE CIO FUNCTION. 
* 
IO.200    EQ   *+4S15 
          SA2    A2 
          MX0    42 
          SX3    B1+B1
          BX0    X0+X3
          BX3    -X0*X2      OP CODE
          SA4    B2 
          BX4    X0*X4       FILE NAME
          BX6    X4+X3
          SA6    A4          PUT NEW OPCODE IN FET
          SX6    B1 
          LX6    40 
          BX6    X6*X2       RECALL BIT 
          MX4    18 
          LX4    36 
          BX4    X4*X2       RECORD COUNT IF ANY
          BX6    X4+X6
          SX2    B2          FET ADDRESS
          BX2    X6+X2
          SX6    3RCIO
          LX6    42 
          BX6    X2+X6
          RJ   =XSYS=        ISSUE
          EQ   IO.200 
