*COMDECK,IOCOM
****
*        START OF COMDECK IOCOM 
          SPACE    2
*     FUNCTION - IO CARRIES OUT THE BLOCKING, DEBLOCKING, 
*     SUPPRESSION OF TRAILING BLANKS, AND PROVISION OF TRAILING 
*     BLANKS NEEDED FOR THE MACROS READIN AND WRITOUT. AT 
*     FIRST SIGHT IT IS COMPOSED OF FOUR SUBROUTINES, IOSAV, IOISS, 
*     IOREAD AND IOWRITE. IOSAV AND IOISS ARE PROPER SUBROUTINES. IOSAV 
*     IS CALLED BY IOWRITE AND IOREAD, AND ALSO BY PROGRAM IORANDM
*     (WHICH DOES READIN AND WRITOUT FOR RANDOM FILES.) 
*     IOREAD AND IOWRITE, HOWEVER, SET UP THE EXIT JUMP 
*     FROM IO AT IORE, AND THEN THEIR PATHS (THOSE OF IOREAD
*     AND IOWRITE) JOIN AT IOIO. THIS IS ALSO TRUE OF THE 
*     APPARENT SUBROUTINES IORR AND IORW IN PROGRAM IORANDM.
*     THEY CALL SUBROUTINE IOSAV, WHICH INCIDENTALLY SETS 
*     UP THE EXIT AT IORE, AND THEN AFTER MANIPULATING THE
*     FET AND THE INDEX EACH OF THEM JOINS IO AT IOIO.
*     IO IS MODIFIED FOR REWITE FUNCTIONS 
*     ADDED ENTRY POINTS ARE IOREWRT FOR IO, AND IORRW FOR IORANDOM.
          SPACE    2
*     ENTRY INFORMATION -- A CALLING SEQUENCE 
*       RJ  IOREAD,   RJ  IOWRITE   OR   RJ IOREWRT 
*        VFD 60/FET 
*     OR
*       RJ  IORR,   RJ  IORW   OR   RJ  IORRW 
*        VFD 60/FET 
*        VFD 60/RECNUM  OR  VFD 42/RECNAME,18/0 
*     EXIT INFORMATION -- X1, ON RETURN FROM EXECUTING THE MACRO, 
*     CONTAINS 0 UNLESS A READ WAS CALLED FOR AND COULD NOT BE FULLY
*     CARRIED OUT. IF THE BUFFER WAS EMPTY AND READING THE FILE FOUND 
*     AN EOF, X1 WILL BE NEGATIVE. OTHERWISE, IF AN END OF RECORD WAS 
*     REACHED ON THE FILE BEFORE THE WORK SPACE IDENTIFIED AT FET+5 
*     COULD BE FILLED, X1 WILL CONTAIN THE ADDRESS OF THE FIRST 
*     UNFILLED WORD OF THE WORKSPACE. IN THE CASE OF A BCD FILE,
*     THIS WILL NECESSARILY BE THE FIRST WORD OF THE WORKSPACE. 
          SPACE    2
*     REGISTERS USED -- A1, A6, X1, X6
          EJECT 
*     IOREG PROVIDES SPACE FOR SAVING THE REGISTERS, EXCEPT A1, X1, 
*     A6 AND X6 ON ENTRY TO IOREAD, IOWRITE, IORR, OR IORW. 
          SPACE    1
****
 IOREG    BSS      9
          SPACE    2
****
*     SUBROUTINE IOSAV IS CALLED IMMEDIATELY WHEN IOREAD, IOWRITE,
*     IORR, AND IORW ARE ENTERED, TO SAVE REGISTERS, SET UP A FINAL 
*     EXIT AT IORE, CHECK THE FIRST AND LAST+1 ADDRESSES OF THE 
*     WORKSPACE AS GIVEN IN FET+5, AND PUT THEM IN B3 AND B2. 
*     THE CALLING SEQUENCE IS 
*         +   RJ  IOSAV 
*         -  JP  N
*     WHERE N IS 1 OR 2, DEPENDING ON WHETHER THE CALLING SEQUENCE
*     TO THE ROUTINE THAT NOW CALLS IOSAV IS 2 OR 3 WORDS LONG
*     (2 FOR IOREAD AND IOWRITE, 3 FOR IORR AND IORW.) IOSAV NEEDS
*     THIS IN ORDER TO SET UP THE FINAL RETURN FROM IOREAD, 
*     IOWRITE, IORR OR IORW AT IORE.
          SPACE    1
*     ENTRY INFORMATION -- ONLY THE CALLING SEQUENCE
*     EXIT INFORMTION -- THE POINTERS TO THE WORKSPACE IN B2 AND
*     B3 AND THE FINAL EXIT SET UP IN IORE. 
          SPACE    2
****
 IOSAV   DATA      0
          RJ       CPC03  SAVE ALL REGS. EXCEPT A1,A6,A6,X6, SET B1=1 
          VFD      60/IOREG 
          SA1      IOSAV
          AX1      30 
          SA4      X1-1 
          SX6      X4         1 OR 2
          SA4      A4-B1
          LX4      30 
          IX6      X4+X6
          LX6      30 
          SA6      IORE       RETURN
          SA1      X4 
          SA0      X1         LFN 
          SA1      A0+B1
          LX1      36 
          AX1      54 
          ZR       X1,IOSVA   NO FWA,LWA
          SA1      A0+5 
          SB2      X1         LWA+1 
          AX1      30 
          SB3      X1         FWA 
          GE       B2,B3,IOSAV
 IOSVA    RJ       CPC999   GIVE DAYFILE MESSAGE AND ABORT. 
 -        JP       IOBL 
          DIS      2,FWA-LWA ERROR
 IOBL     DIS      1, 
      EJECT 
**    SUBROUTINE IOREAD IS CALLED IN MACRO READIN UNLESS FOR THE
*     BEGINNING OF A RECORD IN A RANDOM FILE. FIRST IOSAV IS CALLED,
*     WITH 1 IN THE CALLING SEQUENCE TO SHOW THE CALLING
*     SEQUENCE FOR IOREAD WAS 2 WORDS LONG. THEN PUT 10B IN X0
*     AS THE BASIC OPERATION CODE FOR READING, AND JOIN THE 
*     PATHS FROM IOWRITE, IORR, AND IORW AT IOIO. THE EXIT IS 
*     NOT THROUGH IOREAD, BUT THROUGH IORE. 
          SPACE    2
 IOREAD   DATA     0
          RJ       IOSAV
 -        JP       1
          SX0      10B
          EQ       IOIO 
          SPACE    4
**    SUBROUTINE IOREWRT IS CALLED IN MACRO WRITIN UNLESS FOR 
*     THE BEGINNING OF A RECORD IN A RANDOM FILE. THE REMARKS 
*     ABOVE TO IOREAD APPLY, EXCEPT THAT 214B IS PUT IN X0 AS 
*     THE BASIC OPERATION CODE FOR REWRITING BEFORE GOING TO IOIO.
          SPACE    2
 IOREWRT  DATA     0
          RJ     IOSAV
 -        JP     1
          SX0      214B 
          EQ     IOIO 
          SPACE    4
**    SUBROUTINE IOWRITE IS CALLED IN MACRO WRITOUT UNLESS FOR
*     THE BEGINNING OF A RECORD IN A RANDOM FILE. THE REMARKS 
*     ABOVE TO IOREAD APPLY, EXCEPT THAT 14B IS PUT IN X0 AS
*     THE BASIC OPERATION CODE FOR WRITING BEFORE GOING TO IOIO.
          SPACE    2
 IOWRITE  DATA     0
          RJ       IOSAV
 -        JP       1
          SX0      14B
          EJECT 
**    FROM IOIO DOWN IS MORE OR LESS COMMON TO IOREAD, IOWRITE, 
*     IORR, AND IORW. IORR IS INDISTINGUISHABLE AT THIS POINT FROM
*     IOREAD, AND IORW FROM IOWRITE. BUT WE IMMEDIATELY SET 
*     B6 TO 0 FOR READING AND 4 FOR WRITING, AND MOST OF THE LOCATION 
*     SYMBOLS BEGINNING IOO ARE FOR WRITING, WHILE THOSE BEGINNING
*     IOI BUT NOT IOIO ARE FOR READING. 
          SPACE    2
 IOIO     SA4      A0 
          SB6      X0-10B     0 READ, 4 WRITE 
          SX6      B1+B1
          BX5      X6*X4
          SB7      X5              NONZERO IF BINARY
          BX0      X0+X5      OPCODE
          SA4      A0+B1      FIRST 
          BX4      -X4
          SB4      X4         -(FIRST) TO B4
          SA4      A0+4       LIMIT 
          BX4      -X4
          SB5      X4         -(LIMIT) TO B5
          SX2      B3-B2
          PL       X2,IOIK
          SA1      IOBL   FOR USE AFTER IOSQ OR JUST BELOW HERE 
          NZ       B6,IOIOA 
          NZ       B7,IOI 
**    NOW WE KNOW WE ARE READING IN BCD MODE. FIRST WE PUT BLANKS 
*     IN X1 AND FILL THE WORKSPACE
*     WITH BLANKS, BEFORE BRANCHING TO IOI TO COPY A LINE OF
*     DATA FROM THE BUFFER INTO THE WORKSPACE, BEGINNING FROM THE 
*     LEFT. 
*     IN THE INSTRUCTION JUST ABOVE THIS COMMENT, WE WENT STRAIGHT
*     TO IOI IN CASE OF BINARY-MODE READING, AS THERE WAS NO NEED 
*     TO PROVIDE BLANK FILL IN THE WORKSPACE. 
          SA1      IOBL 
          BX6      X1 
 IOIOB    SA6      X2+B2
          SX2      X2+B1
          NG       X2,IOIOB 
          EQ       IOI
          SPACE    2
**    WE COME TO IOIOA FOR WRITING. IF IN BINARY MODE, BRANCH 
*     IMMEDIATLY TO IOO TO TRANSFER THE ENTIRE WORKSPACE TO THE BUF-
*     FER. BUT IF IN BCD MODE, PROCEED BELOW TO SUPPRESS TRAILING 
*     BLANKS. X1 ALREADY CONTAINS BLANKS. WE SUPPRESS TRAILING BLANKS 
*     BY REDUCING POINTER B2 BY 1 FOR EVERY FULL WORD OF BLANKS AT
*     THE END OF THE WORKSPACE, BUT NOT BELOW B3+1. 
 IOIOA    NZ       B7,IOO 
          SA2      B2 
          MX4      0
 IOSQ     SA2      A2-B1
          SB2      A2+B1
          IX6      X1-X2
          SX5      A2-B3
          NZ       X6,IOO1                                              20177 21
          SX4      X4+1 
          NZ       X5,IOSQ
          SPACE    2
**    WE COME TO IOO WHEN TRAILING BLANKS HAVE BEEN SUPPRESSED IF 
*     NECESSARY, AND WE ARE READY TO TRANSFER WHAT LIES BETWEEN 
*     B3 AND B2-1 INCLUSIVE TO THE BUFFER. AFTER TRANSFERRING EACH
*     WORD, WE STEP UP B3 AND RETURN TO IOO.
*     HENCE THE TEST AT IOO BRANCHES TO IOOF WHEN ALL THE WORDS HAVE
*     BEEN TRANSFERRED TO THE BUFFER. 
          SPACE  1                                                      20177 23
IOO1      SA3      B2-1            FETCH LAST WORD TO BE WRITTEN        20177 24
          MX5      48                                                   20177 25
          BX6      -X5*X3          LOOK AT LAST TWO CHARACTERS          20177 26
          SA6      SAVEIT                                               20177 27
          ZR       X6,IOO          IF THEY ARE NOT ZERO OR BLANKS       20177 28
          MX5      60-6            CHECK FOR TRAILING COLON IN CHAR 10
          BX5      -X5*X3 
          NZ       X5,IOO2         NOT COLON
          ZR       X4,IOO 
          SX6      55B
          LX6      60-6 
          SA6      B2+
          SB2      B2+B1
          EQ       IOO1 
 IOO2     BSS      0
          SX6      X6-2R           X7 WILL BE NON ZERO                  20177 29
          SA6      SAVEIT                                               20177 30
          NZ       X6,IOO                                               20177 31
          SX4      005555B         CHECK FOR TRAILING COLON IN CHAR 8 
          MX5      60-18
          BX6      -X5*X3 
          IX6      X6-X4
          MX5      60-12
          NZ       X6,IOO3         IF NO TRAILING ZERO
          SA6      B2+             INSERT ZERO WORD 
          MX5      60-6 
          SB2      B2+B1
          BX6      X3*X5
          SA6      A3 
          EQ       IOO1 
 IOO3     BSS      0
          BX6      X3*X5           REPLACE BLANKS WITH ZEROS            20177 32
          SA6      A3                                                   20177 33
          MX6      60              SET REPLACE-BLANK-FOR-EDITLIB-FLAG   20177 34
          SA6      SAVEIT                                               20177 35
 IOO      GE       B3,B2,IOOF   IS THERE MORE DAT IN CALLERS BUF
          SA3      B3         YES, GET WORD OF DATA 
          SB3      B3+B1
 IOOB     SA5      A0+3       GET OUT 
          SX4      X5+B4
          SX5      X5 
          NZ       X4,IOOC    IS OUT = FIRST
          SX5      B0-B5      YES, GET LIMIT
 IOOC     SA4      A0+2       GET IN
          SX6      X4+B1      IN + 1
          IX5      X6-X5
          NZ       X5,IOOD    IS OUTPUT BUFFER FILLED 
          SX4      22B             YES - WRITE WITH RECALL
          RJ       IOISS
          EQ       IOOB 
 IOOD     BX6      X3 
          SA6      X4         STORE WORD IN BUFFER
          SX6      X4+B1      BUMP IN 
          SX1      X6+B5
          NZ       X1,IOOE    HAS IN REACHED LIMIT
          SX6      B0-B4      YES, SET IN = FIRST 
 IOOE     SA6      A0+2       UPDATE IN 
          NZ       B7,IOO 
**    IF WE ARE WRITING IN BINARY, WE HAVE BRANCHED STRAIGHT BACK TO
*     IOO. BUT IF IN BCD, WE NOW SEE IF THE LAST WORD WE PUT IN 
*     THE BUFFER ENDED IN A ZERO BYTE. IF NOT, BACK TO IOO. BUT IF
*     SO, THAT WORD TERMINATED THE LINE EVEN THOUGH THERE MAY HAVE
*     BEEN NON-BLANKS AFTER IT IN THE WORKSPACE, SO GO TO IOIK. 
          MX6      48 
          BX6      -X6*X3 
          NZ       X6,IOO 
          SPACE    2
**    WE COME TO IOOF WHEN WE HAVE COPIED EVERYTHING NEEDFUL FROM THE 
*     WORKSPACE TO THE BUFFER. NOW IF BINARY MODE, GO TO IOIK 
*     IMMEDIATELY. BUT IF BCD, WE HAVE TO MAKE SURE THAT
*     THE LAST WORD TRANSFERRED ENDED IN TWO BLANKS, WHICH WE CAN 
*     REPLACE BY A ZERO BYTE, OR ELSE ADD ONE MORE WORD ALL ZERO. 
          SPACE  1                                                      20177 18
 IOOF     NZ       B7,IOIK   BRANCH IF BINARY 
          SPACE  1                                                      20177 37
**    NOW IF THE LAST TWO CHARACTERS WERE ORIGINALLY BINARY ZERO JUMP 
*     TO IOIK. IF THEY WERE BLANKS RESTORE THEM FROM BINARY ZERO. 
          SPACE  1                                                      20177 40
          MX6      48 
          BX6      -X6*X3 
          SA3      SAVEIT                                               20177 41
          NZ       X3,IOOF1        NOT ZERO OR BLANK                    20177 42
          PL       X3,IOIK         ORIGINALLY ZERO                      20177 43
          SX6      2R                                                   20177 44
          SA3      B2-1                                                 20177 45
          BX6      X6+X3           RESOTRE THE BLANKS                   20177 46
          SA6      A3                                                   20177 47
          EQ     IOIK                                                   20177 48
          SPACE  1                                                      20177 49
**    HERE WE KNOW THAT ONE MORE WORD MUST BE WRITTEN CONTAINING A
*     FULL WORD OF BINARY ZEROS (ACCORDING TO TRADITION) PUT THE WORD OF
*     ZEROS IN X3 AND SET THE KEY WORD IN X7 TO ZERO TO INDICATE THE
*     END AND LOOP BACK TO IOOB.
          SPACE  1                                                      20177 54
IOOF1     ZR       X6,IOIK    LAST BYTE ZERO
          MX3      0
          SX6    B0                                                     20177 56
          SA6    SAVEIT                                                 20177 57
          EQ       IOOB                                                 20177 58
          SPACE  1                                                      20177 59
SAVEIT    BSS      1                                                    20177 60
          SPACE  1                                                      20177 61
          SPACE    4
**    THE READ ROUTINE BEGINS PROPERLY AT IOI, BUT IOIA SITS ABOVE IT 
*     TO SAVE A WORD OF PROGRAM.
          SPACE    1
 IOIA     SX4      22B             READ WITH RECALL 
          RJ       IOISS
          SPACE    2
**    WE COME TO IOI WHEN WE KNOW WE ARE TO READ IN BINARY, OR
*     KNOW WE ARE TO READ IN BCD AND HAVE PRESET THE WORKSPACE TO 
*     BLANKS. THEN AFTER TRANSFERRING EACH WORD FROM THE BUFFER 
*     TO THE WORKSPACE WE SHALL RETURN TO IOI FOR THE NEXT WORD.
          SPACE    2
 IOI      SA4      A0+2       GET IN
          SA1      A4+B1      GET OUT 
          IX4      X4-X1
          NZ       X4,IOIC    IS THERE ANY DATA IN BUFFER 
          SA1      A0         NO
          LX1      50 
          NG       X1,IOIMA        TREAT EOI AS EOF 
          SA1      A0 
          SA3      =777770B 
          BX1      X3*X1
          SA3      =740030B 
          IX3      X1-X3
          ZR       X3,IOIMA 
          SA1      A0 
          SX3      160B            X3 = MASK FOR OPEN FUNCTION          0865   4
          BX6      X3*X1           X6 = POSSIBLE OPEN CODE              0865   5
          IX3      X6-X3           CHECK IF OPEN,WR CODE PRESENT        0865   6
          SX6      X6-120B         CHECK IF OPEN,NR CODE PRESENT        0865   7
          ZR       X3,IOIA         JUMP IF OPEN CODE PRESENT            0865   8
          ZR       X6,IOIA         JUMP IF OPEN CODE FOUND              0865   9
          SX3    240B        MASK FOR SKIPF 
          BX6    X3*X1
          IX3    X6-X3
          ZR     X3,IOIA     JUMP IF SKIPF/SKIPB
          LX1      55 
          PL       X1,IOIA     NOT EOR, READ ON 
          NZ       B7,IOIM    BINARY
**    NOW WE KNOW WE ARE READING BCD, AND HAVE STRUCK AN END OF 
*     RECORD BEFORE COMING TO AN END OF LINE OR FILLING THE WORK- 
*     SPACE. NOW IF WE HAVE NOT PUT ANYTHING IN THE WORKSPACE SO
*     FAR, WE WANT TO RETURN WITH AN EOR INDICATION IN X1, AFTER
*     SUPPRESSING THE EOR BIT IN THE FET, SO THAT THE NEXT TIME 
*     IOREAD IS CALLED WE CAN GO ON READING THE NEXT RECORD.
*     BUT IF WE HAVE PUT ONE OR MORE WORDS IN THE WORKSPACE, WE 
*     MUST MAKE AN END OF LINE NOW, AND EXIT WITHOUT AN EOR 
*     INDICATION. THE NEXT CALL TO IOREAD WILL GET THE EOR. 
*     THE CHEAPEST WAY TO FIND OUT IF WE HAVE PUT ANYTHING IN THE 
*     WORKSPACE IS TO TEST X5. THIS IS SET TO 0 AT THE THIRD INSTRUC- 
*     TION BELOW IOIO, IF BCD, AND IS NOT TOUCHED, IF READING, EXCEPT 
*     FOR BEING SET TO 1 JUST AFTER IOID. IF NONZERO, WE GO OUT 
*     TO IOIK AS IF AN END OF LINE HAD BEEN READ, LEAVING THE BUFFER
*     EMPTY AND THE EOR BIT STILL SET FOR THE NEXT TRIP THROUGH 
*     IOREAD. IF ZERO WE GO THROUGH IOIM TO DISTINGUISH EOF FROM
*     EOR.
          NZ       X5,IOIK    TREAT EOR AS END OF LINE ONCE 
 IOIM     LX1      1
          PL       X1,IOIY    EOR 
          SA1    A0+5                   WSA ADDRESS 
          AX1    30                     FWA OF WSA
          SB4    X1 
          EQ     B3,B4,IOIMA            TEST FOR NO DATA MOVED
          SX6    B3 
          SA6    IOZW 
          EQ     IOZZ 
 IOIMA    SB3      -B1             EOF
 IOIY     SX6      B3 
          EQ       B3,B2,IOZZ 
          SA6      IOZW 
          SA1      A0 
          SX6       20B 
          BX6      -X6*X1 
          SA1      A1+B1
          LX1      12 
          NG       X1,IOZZ
          SA6      A0         ERASE EOF OR EOR BIT UNLESS RANDOM FILE 
          SPACE 2 
**    IN A NON-RANDOM FILE, WE RESET THE EOR BIT IN THE FET SO THAT 
*     IOREAD WILL BE ABLE TO CONTINUE READING INTO THE NEXT RECORD, 
*     AFTER SIGNALLING THE EOR TO THE CALLER ONCE. BUT IN A 
*     RANDOM FILE THIS IS NOT DONE, AND REPEATED CALLS TO IOREAD
*     WILL JUST GIVE REPREATED EOR RESPONSES, UNLESS THE CALLER 
*     DELIBERATELY RESETS THE EOR BIT HIMSELF.
          EQ       IOZZ 
          EJECT 
**    SUBROUTINE IOISS IS USED TO DO THE ACTUAL READING OR WRITING OF 
*     THE FILE. 
*     ENTRY INFORMATION -- 20B IN X4 FOR A READ OR WRITE WITHOUT
*     RECALL, OR 22B WITH RECALL. THE 20 WILL BECOME 000002B IN THE 
*     LEFT END OF THE REQUEST, INDICATING PP PROGRAM CIO, AND THE 2 
*     OR 0 WILL GO INTO BIT 40 OF THE REQUEST FOR YES OR NO RECALL. 
*     X0 CONTAINS 10B FOR READ OR 14B FOR WRITE. THE BINARY/BCD 
*     MODE BIT WILL BE FURNISHED BY CPC FROM THE FIRST WORD OF THE
*     FET.
*     EXIT INFORMATION - NONE.
          SPACE    2
 IOISS    DATA     0
          SX6      20B
          SA1      A0 
          BX6      -X6*X1 
          SA6      A0 
          LX4      39 
          BX6      X4+X0
 +        SA6      *+1
          RJ       CPC
          DATA     0
          EQ       IOISS
          EJECT 
*     IOIC IS REACHED FROM THE THIRD INSTRUCTION AFTER IOI. 
 IOIC     SA3      X1         GET WORD IN BUFFER
          SX6      X1+B1      BUMP OUT
          SX4      X6+B5
          NZ       X4,IOID    HAS OUT REACHED LIMIT 
          SX6      B0-B4      YES, SET OUT = FIRST
 IOID     SA6      A0+3       SET OUT 
          NZ       B6,IOIF    ARE WE SKIPPING TO THE NEXT CARD
          MX2      48         NO
          BX2      -X2*X3 
          BX6      X3 
          SX5      X5+B1      COUNT OF WORDS READ 
*     THIS IS THE SETTING OF X5 REFERRED TO IN THE NOTE JUST BEFORE 
*     IOIM. 
          NZ       B7,IOIE    IS THIS A BINARY READ 
*     IF THE WORD JUST TRANSFERRED ENDED IN A ZERO BYTE, X2=0.
*     THIS HAS NO SIGNIFICANCE FOR BINARY READING, BUT IF BCD,
*     IT MEANS AN END OF LINE. NO MORE TO BE TRANSFERRED, GO
*     TO IOIG.
          ZR       X2,IOIG    NO, LOOK FOR END OF BCD RECORD
 IOIE     SA6      B3         STORE WORD IN CALLERZ BUFFER
          SB3      B3+B1
          LT       B3,B2,IOI  HAS REQUIRED NUMBER OF WORDS BEEN READ
          NZ       B7,IOIK    WAS THIS A BCD READ 
          SPACE 2 
**    IF WE REACH THIS POINT, WE ARE READING BCD, WE HAVE FILLED THE
*     WORKSPACE, BUT WE HAVE NOT YET FOUND A WORD ENDING IN A 
*     ZERO BYTE. SO WE SET B6 TO 1 (NORMALLY IT IS 0 FOR READING
*     AND 4 FOR WRITING, BUT WE AREA ALREADY FIRMLY IN THE READING
*     PART OF THE PROGRAM) AND GO BACK TO IOI TO CONTINUE PROCESSING
*     WORDS FROM THE BUFFER. EVERYTHING GOES ON AS BEFORE, UNTIL
*     AN EOR OR A WORD ENDING IN A ZERO BYTE IS FOUND, EXCEPT THAT
*     FROM IOID WE SHALL SKIP TO IOIF INSTEAD OF STORING EACH WORD
*     IN THE WORKSPACE. AT IOIF WE TEST EACH WORD FOR FINAL ZERO
*     BYTE, GO BACK TO IOI IF NO, AND IF YES SET B6 BACK TO 0 AND 
*     GO OUT TO IOIK. 
          SB6      B1         YES 
          EQ       IOI        GO BACK AND SKIP TO END OF CARD 
 IOIF     MX4      48 
          BX4      -X4*X3 
          NZ       X4,IOI     HAVE WE SKIPPED FAR ENOUGH
          SB6      B0         YES 
          EQ       IOIK 
          SPACE    2
**    WE COME TO IOIG WHEN, IN BCD READING, WE HAVE TAKEN A WORD
*     ENDING IN A ZERO BYTE FROM THE BUFFER, BUT HAVE NOT STORED IT 
*     IN THE WORKSPACE AT THE ADDRESS GIVEN IN B3. BEFORE STORING 
*     IT WE MUST REPLACE ZERO CHARACTERS ON THE RIGHT BY BLANKS.
*     NOTE THAT WE KEEP STORING IT IN THE INSTRUCTION AFTER IOIH, 
*     AND DO NOT RECOGNIZE THAT WE HAVE PUT IN ENOUGH BLANKS UNTIL
*     AFTER THE LAST TIME WE STORE IT. THIS IS MERELY TO SAVE A 
*     WORD OF PROGRAM.
          SPACE    1
IOIG      NZ       X3,IOIGA   LESS THAN 60 BITS IN LINE ENDER 
          AX2      X5,B1
          ZR       X2,IOIGA   LINE IS NOTHING BUT ZERO WORD 
          SA2      B3-B1      CHECK PRECEDING WORD FOR COLON AT END 
          MX4      54 
          BX4      -X4*X2 
          NZ       X4,IOIGA   NO PROBLEM AFTER ALL
          SX4      1R 
          BX6      X2+X4      REPLACE THAT COLON BY BLANK 
          SA6      A2 
          BX6      X3 
IOIGA     SX2      55B        SET BLANKS IN TRAILING ZERO CHARS 
          SX3      77B
 IOIH     BX4      X6*X3
          SA6      B3 
          IX6      X2+X6      NO, INSERT BLANK
          LX2      6
          LX3      6
          ZR       X4,IOIH
          SB3      B2 
**    HAVING STORED THE LAST WORD OF THE LINE, WE SET B3=B2 AS IF 
*     WE HAD STORED WORDS ACROSS THE WHOLE WORKSPACE, TO SHOW THAT
*     THE REQUEST HAS BEEN LOGICALLY COMPLETED. THIS IS NEEDED
*     FOR THE TEST IN THE INSTRUCTION AFTER IOIY. WE SHALL REACH
*     THAT INSTRUCTION IF THE FET SHOWS EOR STATUS, AND IF B3 
*     DID NOT =B2 AT THAT POINT WE WOULD GIVE AN INCOMPLETE RESPONSE. 
          SPACE    2
**    WE COME TO IOIK WHEN WE HAVE COMPLETED THE REQUEST, OR HAVE 
*     STRUCK EOR BEFORE COMPLETING A READ. IF THE FET SHOWS BUSY
*     STATUS, WE GO STRAIGHT TO IOZZ. IF NOT BUSY, AND EITHER THE 
*     REQUEST WAS FOR WRITING, OR IT WAS FOR READING AND THE FET
*     STATUS IS NOT EOR, AND IF THE BUFFER IS AT LEAST HALF EMPTY 
*     IF READING, OR HALF FULL IF WRITING, WE CALL IOISS FOR A
*     READ OR WRITE WITHOUT RECALL, JUST TO KEEP THE FILE MOVING. 
*     THEN IF X5 IS NOT 0 WE HAVE PUT SOMETHING IN
*     THE WORKSPACE AND WE GO OUT TO IOZZ. BUT IF X5=0 WE HAVE PUT
*     NOTHING IN THE WORKSPACE, AND GO TO IOIM TO PROVIDE AN
*     EOR RESPONSE TO THE CALLER. 
 IOIK     SA3      A0 
          LX3      59 
          PL       X3,IOZZ         FILE BUSY ALREADY
          SA1      A0+1                                                 0764   6
          MX4      54 
          LX1      6
          BX1      -X4*X1 
          SX1      X1-61B          SPECIAL CASE REMOTE FILE 
          ZR       X1,IOZZ
          SA3      A0+2            IN 
          SX3      X3 
          SA4      A3+B1      OUT 
          SX4      X4 
          IX2      X3-X4                                                0764   8
          NZ       B6,IOIL    IF WRITE
          SA1      A0 
          LX1      55 
          PL       X1,IOIL
          ZR       X5,IOIM
          EQ       IOZZ 
 IOIL     SX3      B4-B5      LIMIT-FIRST 
          PL       X2,IOIKA                                             0764  10
          IX2      X2+X3                                                0764  11
IOIKA     IX4      X3-X2                                                0764  12
          SX4      X4-1       SPACW IN BUFFER 
          NZ       B6,IOIKB   WRITE 
          BX6      X4 
          BX4      X2                                                   0764  14
          BX2      X6                                                   0764  15
IOIKB     IX6      X2-X4                                                0764  16
          NG       X6,IOZZ
          SX4      20B             READ OR WRITE WITHOUT RECALL 
          RJ       IOISS
          SPACE    2
**    WE COME TO IOZZ WHEN WE ARE READY TO EXIT FROM IOREAD, IOWRITE, 
*     IORR, OR IORW. FIRST CALL CPC04 TO RESTORE ALL REGISTERS
*     EXCEPT A1, A6, X1, X6.  THEN PICK UP THE RESPONSE WORD FROM 
*     IOZW IN X1, AND REZERO IOZW. THEN TAKE THE EXIT PREPARED IN 
*     IORE. 
 IOZZ     RJ       CPC04
          VFD      60/IOREG 
          SA1      IOZW 
          SX6      B0 
          SA6      A1 
 IORE     DATA     0
 IOZW     DATA     0
*        END OF IOCOM 
