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