.
.         INPUT PROCESS
.
.
.         (C)  Copyright 1972-1978  John Walker
.
.         This software is in the public domain
.
          AXR$
          DEFUNCT$
          FANG
          PURE      CODE
.
.         LX,U      X10,<FCT>
.         LMJ       A2,INPUT
.         <RETURN>
.
INPUT*    FORK      READSU              CREATE READER ACTIVITY
          J         0,A2                RETURN TO MAIN PROCESS
.
.         READ ACTIVITY
.
.         READS BLOCKS AND FILLS UP BOUNDED BUFFER
.
READSU    LA,U      A0,R$               GET READ FUNCTION
          SA        A0,IOFUNC,X10       SET UP I/O PACKET FOR READING
          LA,U      A11                 CLEAR SDF OFFSET
          LR,U      R14                 CLEAR PROTECTION BUFFER ADDRESS
          LA        A0,IOFDT,X10        GET FDT ADDRESS FOR THIS FILE
          TNZ       FDPROT,A0           IS FILE ENCODED ?
          J         READPR              NO.  SKIP BUFFER ALLOCATION
          BGET      PROTL               ALLOCATE A PROTECTION WORK BUFFER
          LR,U      R14,,A0             SAVE BUFFER ADDRESS IN R14
.
READPR    LA        A0,IOBLEN,X10       LOAD BLOCK LENGTH
          AA,U      A0,IBDATA+1         GET ACTUAL LENGTH NEEDED FOR BLOCK BUFFE
          BGET      .                   ALLOCATE A BLOCK BUFFER
          LX,U      X9,,A0              MAKE X9 THE BLOCK POINTER
          SZ        IBSTAT,X9           CLEAR STATUS
          SZ        IBLAST,X9           MARK NOT LAST BLOCK
          SX        X10,IBIOP,X9        SET BLOCK BACKPOINTER TO FCT
          LXI       A0,IOBLEN,X10       FORM ACCESS WORD
          AA,U      A0,IBDATA           POINT TO DATA BUFFER START
          TNZ       IOMASS,X10          IS IT MASS STORAGE ?
          AA        A0,(1,0)            NO.  SE UP FOR TAPE OVERFLOW CHECK
          SA        A0,IOACW,X10        PUT ACCESS WORD IN PACKET
.
.         THE FOLLOWING CHECK IS PART OF THE KLUDGE NECESSARY
.         BECAUSE IT ISN'T POSSIBLE TO GET ENOUGH INFORMATION
.         FROM FITEM$ TO KNOWLEDGEABLY DUMP A WORD ADDRESSABLE
.         FILE TO THE END.  SINCE WE CAN'T GET THE HIGHEST
.         TRACK ALLOCATED FOR A TEMPORARY FILE, WE USE THE
.         MAX LENGTH INSTEAD, AND DO MANY EXTRA ACCESSES TO
.         DETERMINE THAT NONE OF THE SPACE IS ALLOCATED.  THE
.         FOLLOWING CHECK INSURES THAT WE DON'T START A READ
.         OFF THE END OF THE FILE.
.
.
.
          TNZ       IOMASS,X10          MASS STORAGE FILE ?
          J         SKLUJ               NO.  SKIP END ADDRESS CHECK
          LA        A1,IOFDT,X10        LOAD FDT ADDRESS
          SZ        IBLEN,X9            CLEAR BLOCK LENGTH
          TNZ       IOWAD,X10           WORD-ADDRESSABLE FILE ?
          J         FFEOFCK             NO.  MAKE FASTRAND FORMAT CHECK
          LA        A0,FDFLW,A1         LOAD MAX FILE LENGTH IN WORDS
          ANA       A0,IODRAD,X10       SUBTRACT STARTING READ ADDRESS
          JZ        A0,UAEOF            EOF IF STARTING AT END
          JN        A0,UAEOF            OR IF STARTING PAST END
          TLE,H1    A0,IOACW,X10        ACCESS TOO LONG FOR FILE ?
          SA,H1     A0,IOACW,X10        YES.  CHANGE ACCESS LENGTH
          J         SKLUJ               DO I/O OPERATION
.
.         THE REST OF THE CODE HERE IS A SIMILAR CHECK FOR FASTRAND
.         FORMAT FILES, WHICH CAN FUNCTION CORRECTLY SINCE WE GET
.         THE HIGHEST TRACK REFERENCED FROM FITEM$.  NOTE THAT DUE
.         TO THIS CODE A READ FROM BEYOND THE MAX ADDRESS WILL
.         RETURN AN EOF JUST LIKE A READ BEYOND THE DATA AREA BUT
.         WITHIN THE MAX ADDRESS.  TAKING OUT THIS CODE ENABLES
.         THE CONTIGENCY STATUS FOR READ BEYOND MAX ADDRESS.  IT
.         MATTERS LITTLE TO FANG WHETHER IT'S THERE OR NOT.
.
FFEOFCK   LA        A0,FDHITRK,A1       LOAD HIGHEST TRACK REFERENCED
          LSSL      A0,6                CONVERT TO SECTOR ADDRESS
          AA,U      A0,0100             GET FIRST ILLEGAL ADDRESS
          ANA       A0,IODRAD,X10       COMPUTE SECTORS LEFT IN FILE
          JN        A0,UAEOF            PASS EOF IF OFF THE END
          JZ        A0,UAEOF            ...OR AT END OF FILE
          MSI,U     A0,28               A0 = WORDS LEFT IN FILE
          TLE,H1    A0,IOACW,X10        READ PAST END OF FILE ?
          SA,H1     A0,IOACW,X10        YES.  TRIM READ REQUEST
SKLUJ     IOW$      IOPKT,X10           FIRE UP PACKET
          TNZ       IOMASS,X10          IS FILE MASS STORAGE ?
          J         SKINC               NO.  SKIP ADDRESS INCREMENTATION
          LA        A0,IOXFER,X10       LOAD WORDS TRANSFERRED
          TZ        IOWAD,X10           WORD ADDRESSABLE FILE ?
          J         SKWAD               YES.  DON'T NEED TO COMPUTE SECTORS
          DSL       A0,36               SHIFT DOWN
          AA,U      A1,27               MAKE IT A COVERED DIVIDE
          DI,U      A0,28               COMPUTE NUMBER OF SECTORS READ
SKWAD     LR        R6,IODRAD,X10       LOAD ORIGINAL DRUM ADDRESS
          AA        A0,R6               POINT TO NEXT READ ADDRESS
          SA        A0,IODRAD,X10       UPDATE NEXT ADDRESS
          LA        A1,IOFDT,X10        GET FDT ADDRESS
          SA        A0,FDIPLC,A1        SET IN FDT FOR STATUS INTERROGATION
.
.         IF THE INPUT FILE WAS A NINE-TRACK TAPE AND AN ABNORMAL
.         FRAME COUNT WAS DETECTED, WE CHECK WHETHER THE FRAME
.         COUNT IS FIVE.  IF SO, WE HAVE ACTUALLY READ ONE LESS
.         WORD THAN THE WORD TRANSFERRED COUNT INDICATES.  WE THEN
.         DECREMENT THE WORD COUNT AND CLEAR THE ABNORMAL FRAME
.         COUNT INDICATION.
.
SKINC     LA        A0,IOXFER,X10       LOAD WORDS TRANSFERRED
          LA        A1,IOSTATUS,X10     LOAD I/O STATUS CODE
          LA        A2,IOAFC,X10        LOAD ABNORMAL FRAME COUNT
          TE,U      A1,4                WAS AFC DETECTED ON READ ?
          J         NORDAFC             NO.  CLEAR AFC INDICATION
          TE,U      A2,5                WERE EXACTLY 5 FRAMES READ ?
          J         RDAFC               NO.  CAN'T BE ODD 9-TRACK BLOCK
          LA        A1,IOFDT,X10        LOAD FDT FOR INPUT FILE
          LA        A1,FDPROP,A1        LOAD FILE PROPERTY BITS
          TOP,U     A1,EP9TRK           IS IT A NINE-TRACK TAPE ?
          J         RDAFC               NO.  IT'S JUST A 7-TRACK AFC
          ANA,U     A0,1                ODD BLOCK.  DECREMENT TRANSFER COUNT
NORDAFC   LA,U      A2                  CLEAR ABNORMAL FRAME COUNT
RDAFC     SA        A2,IBAFC,X9         SET ABNORMAL FRAME COUNT IN BLOCK
          SA        A0,IBLEN,X9         PUT BLOCK LENGTH IN BUFFER
          TZ        IOMASS,X10          IS THE FILE MASS STORAGE ?
          J         BTRNCR              NO.  DON'T CHECK TRUNCATION
          TG,H1     A0,IOACW,X10        WAS ENTIRE ACW SATISFIED ?
          J         BTRUNC              YES.  EXTRA WORD WAS USED.  TRUNCATION
BTRNCR    LA        A0,IOBLKN,X10       LOAD BLOCK NUMBER
          TZ        IOMASS,X10          IS IT MASS STORAGE ?
          LA        A0,R6               YES.  GET SOURCE ADDRESS
          SA        A0,IBBLKN,X9        SAVE BLOCK NUMBER FOR BLOCK
          JTERM     IOSTOP              TERMINATE IF CEASE FLAG IS SET
          LA        A0,IOSTATUS,X10     LOAD I/O STATUS
          TE,U      A0,4                PERMIT ABNORMAL FRAME COUNT
          JNZ       A0,ABNER            BUT FROWN ON OTHER STATUS
.
.         WE HAVE A BLOCK.  NOW CHECK OPTIONS FOR
.         STOP AND DECOMPOSITION MODES.
.
IOGAF     LA        A0,IOFDT,X10        LOAD FDT ADDRESS
          TNZ       FDPROT,A0           FILE PROTECTION DESIRED ?
          J         IONOPR              SKIP IF PROTECTION IS NOT ON
          DL        A0,FDCRYK,A0        LOAD KEY FOR FILE
          LX,U      X1,IBDATA,X9        LOAD DATA BUFFER START
          LR        R1,IBLEN,X9         LOAD BLOCK LENGTH
          LX        X5,R14              LOAD WORK BUFFER FOR DECIPHER
          LA        A2,IOOPT,X10        LOAD INPUT FILE MODE
          TE,U      A2,'G'              YES.  IS INPUT 'G' OPTION MODE ?
          J         DODCOD              NO.  DECODE ENTIRE BLOCK
          LA        A3,IBLEN,X9         LOAD BLOCK LENGTH FOR BUFFER
          LR,U      R1,1792             ONLY DECODE 1792 WORDS
          AX,U      X1,2                SKIP FIRST TWO WORDS OF BLOCK
          TE,U      A3,28               IS IT LABEL ?  IF SO, DON'T DECODE.
DODCOD    LMJ       X2,DECIPHER         DECIPHER THE DATA IN THE BLOCK
IONOPR    TZ        IOOPT,X10           ARE OPTIONS IN EFFECT
          J         OPTSPC              YES.  LOOK AT THEM
IOCTDC    LA        A0,IOCOUNT,X10      LOAD INPUT BLOCK COUNT
          ANA,U     A0,1                BACK UP BLOCKS TO READ
          JZ        A0,IOSTOP           STOP IF THE LAST ONE
          JN        A0,IOSTOP           OR IN CASE OF OVERSHOOT
          SA        A0,IOCOUNT,X10      PUT BACK BLOCK COUNT
.
IOGO      LA,U      A1,,X9              LOAD BLOCK ADDRESS
          TZ        CDPATCH,X8          ANY PATCH BUFFER ?
          LMJ       X11,PATCH           YES.  APPLY PATCHES
          PUT       IOBB,X10            PUT IT ON THE BOUNDED BUFFER
IOGOS     TNZ       IOMASS,X10          MASS STORAGE FILE ?
          J         IGTAPE              NO.  INCREMENT TAPE BLOCK NUMBER
IGDONE    J         READPR              DO THE NEXT BLOCK
.
IGTAPE    LA        A0,IOBLKN,X10       LOAD BLOCK NUMBER
          AA,U      A0,1                INCREMENT BLOCK NUMBER
          SA        A0,IOBLKN,X10       UPDATE THE BLOCK INDEX
          J         IGDONE              DONE WITH TAPE INCREMENTATION
.
IOSTOP    SNONZ     IBLAST,X9           MARK THIS IS LAST BLOCK
          LA,U      A1,,X9              GET BLOCK BUFFER ADDRESS
          TZ        CDPATCH,X8          ANY PATCHES TO APPLY ?
          LMJ       X11,PATCH           YES.  APPLY THEM NOW
          PUT       IOBB,X10            PUT ON THE BOUNDED BUFFER
          TNZ       IOMASS,X10          MASS STORAGE ?
          J         IOSTEX              NO.  SKIP FINAL POSITION STORE
          LA        A0,CDOPTS,X8        LOAD COMMAND OPTIONS
          TOP,U     A0,OPTION('S')      SPECIFIC ADDRESS WRITE ?
          TEP,U     A0,OPTION('R')      OR ADDRESS RESET REQUESTED ?
          J         IOSTEX              NO.  SKIP ADDRESS PASS BACK
          LA        A0,IOFDT,X10        LOAD FDT ADDRESS
          LA        A1,IODRAD,X10       LOAD FINAL ADDRESS
          SA        A1,FDMSAD,A0        UPDATE ADDRESS
IOSTEX    LA        A0,R14              LOAD PROTECT WORK BUFFER
          TZ        A0                  WAS FILE DECIPHERED ?
          BRELP     A0                  YES.  RELEASE THE BUFFER
          EXIT      .                   TERMINATE INPUT ACTIVITY
.
ABNER     LA        A0,IOSTATUS,X10     LOAD I/O STATUS
          SA        A0,IBSTAT,X9        STORE INTO THE BUFFER
          TE,U      A0,1                WAS IT EOF ?
          J         NOTEOF              OTHER STATUS.
          LA,U      A0,,X10             GET I/O FCT ADDRESS IN A0
          LMJ       X11,EOT             CHECK FOR END OF VOLUME BLOCK
          J         $+2                 IT WAS ONLY AN EOF
          J         SKLUJ               REELS HAVE BEEN SWAPPED.  RETRY READ
          LA        A0,IOOPT,X10        LOAD OPTIONS
          JZ        A0,IOSTOP           THIS IS END IF NO OPTIONS
          TE,U      A0,'M'              COUNT FILES MODE ?
          J         IOSTOP              NO.  TREAT THIS AS END
          LA        A0,IOCOUNT,X10      LOAD THE REQUEST COUNT
          ANA,U     A0,1                BACK IT UP
          SA        A0,IOCOUNT,X10      UPDATE THE COUNT REMAINING
          JZ        A0,IOSTOP           QUIT IF ALL DONE
          JN        A0,IOSTOP           OR IF OVERSHOT
          J         IOGO                OTHERWISE, KEEP ON TRUCKIN'
.
.         ** CHECK END OF TAPE AND MULTI MODE EVENTUALLY **
.
NOTEOF    TNE,U     A0,5                ATTEMPT TO READ UNASSIGNED AREA ?
          J         RDUA                YES.  SEE IF WE SHOULD STOP
RDERR     LA,U      A0,IOPKT,X10        LOAD PACKET ADDRESS
          LMJ       X11,IOSEDT          EDIT THE I/O STATUS
          LA        A1,CDOPTS,X8        LOAD COMMAND OPTIONS
          TOP       A1,(OPTION('E'))    IS THE 'E' OPTION ON ?
          J         ZAPA                NO.  STOP HERE
          LA        A0,IOSTATUS,X10     LOAD I/O STATUS
          TE,U      A0,011              'G' RESPONSE STATUS ?
          TNE,U     A0,012              OR 'B' STATUS ?
          J         IOGAB               YES.  ALLOW IT TO PASS
ZAPA      ZAP       .                   ROADBLOCK THE FILES INVOLVED
          J         IOSTOP              WIND UP THE READ PROCESSING
.
IOGAB     SZ        IBSTAT,X9           LIE TO OUTPUT ABOUT STATUS
          J         IOGAF               RETURN BUFFER NORMALLY
.
.         ** CHECK TERMINATION AND BREAKDOWN OPTIONS **
.
OPTSPC    LA        A0,IOOPT,X10         LOAD I/O OPTIONS
          TNE,U     A0,'M'              COUNT FILE MARKS ?
          J         IOGO                YES.  PASS THIS DATA BLOCK
          TNE,U     A0,'F'              IS IT SDF SCAN MODE ?
          J         SDFCHK              YES.  GO SCAN THE DATA
          TNE,U     A0,'E'              COUNTING ELEMENTS ON TAPE ?
          J         ELTCT               YES.  GO EXAMINE BLOCK
          TNE,U     A0,'G'              'G' OPTION INPUT MODE ?
          J         IOCTDC              YES.  DECREMENT COUNT NORMALLY
          IERR      .                   ILLEGAL / UNIMPLEMENTED INPUT OPTION
.
.         SDF END VALIDATOR
.
SDFCHK    LA,U      A3,IBDATA,X9        LOAD DATA START ADDRESS
          AU        A3,IBLEN,X9         COMPUTE END WORD
          SA        A11,IBBLKN,X9       PASS OFFSET OF FIRST CONTROL WORD
          AA        A3,A11              GET OFFSET OF FIRST CONTROL WORD
IMGLNK    LA,S1     A0,,A3              LOAD OP CODE OF CONTROL WORD
          TNE,U     A0,077              IS IT END-OF-FILE ?
          J         STIOSD              YES.  PASS BACK EOF LOCATION
          AA,S2     A3,,A3              LINK TO NEXT CONTROL WORD
          AA,U      A3,1                INCLUDE LENGTH OF CONTROL WORD
          TLE       A3,A4               PAST END OF BUFFER ?
          J         IMGLNK              NO.  CHAIN TO NEXT CONTROL WORD
          ANA       A3,A4               GET OFFSET INTO NEXT BUFFER
          LA        A11,A3              SAVE OFFSET FOR NEXT TIME
          J         IOGO                READ NEXT BLOCK
.
STIOSD    ANA,U     A3,IBDATA,X9        GET OFFSET OF EOF CONTROL WORD
          SA,H1     A3,IBBLKN,X9        PASS IT TO INTERESTED PARTIES
          J         IOSTOP              PASS IT BACK AS LAST BLOCK
.
.         ELEMENT COUNTING   (INITIAL HAMMER VERSION)
.
.         THIS SHOULD LOOK AT SECTOR LENGTH OR SCAN SDF TO FIND
.         THE END.  CURRENTLY IT LOOKS FOR LABEL BLOCKS AND BACKS
.         UP OVER THE LAST ONE.
.
ELTCT     LA        A0,IBLEN,X9         LOAD LENGTH READ IN
          TE,U      A0,28               LABEL LENGTH ?
          J         IOGO                NO.  PASS IT ON
          DL        A0,IBDATA,X9        LOAD FIRST TWO WORDS OF DATA
          DTE       A0,('**EF**@@@@@@') ELEMENT LABEL BLOCK ?
          J         IOGO                NO. PASS DUMMY BLOCK
          LA        A0,IOCOUNT,X10      LOAD COUNT OF ELEMENTS TO READ
          ANA,U     A0,1                DECREMENT IT
          SA        A0,IOCOUNT,X10      UPDATE COUNT
          JP        A0,IOGO             COUTINUE UNTIL WE'VE GONE TOO FAR
          SZ        IBLEN,X9            CLEAR LENGTH OF BLOCK
          LA,U      A0,1                LOAD EOF STATUS
          SA        A0,IBSTAT,X9        SET BLOCK AS EOF STATUS
          LA,U      A0,MB$              LOAD MOVE BACKWARD FUNCTION
          SA        A0,IOFUNC,X10       PUT FUNCTION IN PACKET
          IOW$      IOPKT,X10           FIRE UP I/O ON THE PACKET
          LA        A0,IOSTATUS,X10     GET STATUS FROM OPERATION
          JZ        A0,IOSTOP           FINISH NORMALLY IF O.K.
          SA        A0,IBSTAT,X9        SET STATUS IN PACKET
          J         NOTEOF              ANALYSE STATUS
.
.         HANDLER FOR UNASSIGNED AREA READ ATTEMPT
.
RDUA      LA        A0,IODRAD,X10       LOAD NEXT READ ADDRESS
          TZ        IOWAD,X10           WORD ADDRESSABLE ?
          J         WADE                YES.  CHECK IT SPECIALLY
          LA        A1,IOFDT,X10        A1 = FDT POINTER
          LA        A1,FDHITRK,A1       LOAD HIGHEST TRACK ASSIGNED
          LSSL      A1,6                CONVERT TRACK TO A SECTOR NUMBER
          AA,U      A1,0101             BASE IT FOR COMPARISON
          TG        A0,A1               IS AREA READ WITHIN ADDRESS RANGE ?
          J         UAEOF               NO.  THIS IS END-OF-FILE.
.
.         AREA READ WAS UNALLOCATED BUT BELOW HIGHEST AREA ALLOCATED
.         TO THE FILE, I.E., A 'HOLE' IN THE FILE.  WE NOW CHECK
.         WHETHER ANY DATA WAS READ ON THIS ATTEMPT.  IF SO, WE
.         PASS THE PARTIAL BLOCK OUT ON THE BOUNDED BUFFER.  IF NOT,
.         WE SIMPLY RELEASE THE BLOCK BUFFER AND TRY AGAIN.
.
          TZ        IBLEN,X9            NULL TRANSFER ?
          J         IOGO                NO.  TRANSMIT PARTIAL BLOCK
          BRELP     X9                  YES.  RELEASE BLOCK BUFFER
.         ** INCREMENT TO NEXT TRACK START **
          TZ        IOXFER,X10          ANY WORDS MOVED ?
          J         IOGOS               . ** FOR NOW, JUST INCREMENT AND TRY IT
          LA        A0,IODRAD,X10       LOAD ADDRESS WE READ FROM
          AND,XU    A0,-077             A1 = START  OF CURRENT TRACK
          AA,U      A1,0100             POINT TO START OF NEXT TRACK
          SA        A1,IODRAD,X10       UPDATE DRUM ADDRESS
          J         IGDONE              DO NEXT I/O
.
.         END OF INFORMATION IN MASS STORAGE FILE
.
.         ** CHANGE TO STERM WHEN TERMINATION IS IMPLEMENTED FULLY **
UAEOF     LA,U      A0,1                LOAD EOF STATUS CODE
          TZ        IBLEN,X9            ANY DATA TRANSFERRED ?
          J         NEFFY               YES.  DON'T FUDGE STATUS
          SA        A0,IBSTAT,X9        SET EOF STATUS IN BUFFER
          SA        A0,IOSTATUS,X10     PUT EOF STATUS IN PACKET
NEFFY     SZ        IODRAD,X10          REWIND THE FILE
          J         IOSTOP              THIS WILL BE LAST BUFFER READ
.
.         WORD ADDRESSABLE END TEST
.
WADE      LA        A0,IODRAD,X10       LOAD UPDATED ADDRESS
          LA        A1,IOFDT,X10        GET ADDRESS OF FDT
          TG        A0,FDFLW,A1         MORE TO COME ?
          J         UAEOF               NO.  CHECK TRANSFER
          TZ        IBLEN,X9            PARTIAL BLOCK READ ?
          J         IOGO                YES.  SEND IT
          BRELP     X9                  RELEASE THE CURRENT BUFFER
          LA        A0,IODRAD,X10       LOAD NEXT ADDRESS
          AA,U      A0,1792             BUMP TO NEXT TRACK
          SA        A0,IODRAD,X10       UPDATE ADDRESS
          LA        A1,IOFDT,X10        LOAD FDT ADDRESS
          SA        A0,FDIPLC,A1        PUT ADDRESS IN CURRENT ADDRESS FDT WORD
          J         IGDONE              TRY AGAIN
.
.         BLOCK TRUNCATION HANDLER
.
BTRUNC    R$DIT     .                   ENTER EDITING MODE
          E$MSG     TRUNCM              COPY TRUNCATION MESSAGE
          E$DECV    IOBLEN,X10          EDIT BUFFER LENGTH
          E$MSGR    .                   COPY REST OF MESSAGE
          LA        A0,IOFDT,X10        LOAD FDT ADDRESS
          LMJ       X11,FIST            APPEND FILE AND STATEMENT
          J         BTRNCR              RETURN THE TRUNCATED BLOCK TO USER
.
.
          PURE      DATA
TRUNCM    'BLOCK EXCEEDING ! WORD BUFFER LENGTH TRUNCATED WHEN READ FROM !'
          END