. . 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