/P?S NON-SYSTEM LINC-8 DECTAPE HANDLER XLIST OFF IFNDEF OFF IFNDEF ON XLIST ON; IFZERO 1 < P?S/8 NON-SYSTEM LINC-8 DECTAPE HANDLER FOR THE MODIFIED LINC-8. FEATURES: 1) SUPPORT OF EIGHT UNITS (0-7). 2) INDIVIDUAL RETENTION OF LATEST BLOCK INFORMATION. 3) THROUGH USE OF 2), CORRECT INITIAL SEARCH DIRECTION. 4) PARITY ERROR DETECTION AND RETRY (WITH COUNTER). 5) ADJUSTABLE (ONE WORD) CUSTOM OVERSHOOT FACTOR. LAST EDIT: 12-NOV-1983 14:00:00 CJL MAY BE ASSEMBLED WITH '/J' SWITCH SET. DEFINITIONS. > XLIST ON ACMN= 6177 /LOAD MOTION CONTROL FROM AC CLRLC= 6154 /CLEAR LINE COUNTER CLTF= 6144 /CLEAR AC, TAPE FLAG IAAC= 6171 /READ LINC "A" REGISTER IACA= 6167 /LOAD LINC "A" REGISTER IACF= 6175 /LOAD INDICATOR FLIP-FLOPS IACS= 6163 /LOAD LINC "S" REGISTER ICON= 6141 /LOAD INTERFACE CONTROL PER AC[8-11] ITAC= 6157 /READ MARK WINDOW LDUW= 6162 /LOAD READ/WRITE FLIP-FLOP AND UNIT[2] LRWS= 6166 /LOAD READ/WRITE MODE AND SKIP IF WRITING NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL2000= CLA CLL CML RTR /LOAD AC WITH 2000 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 NL7777= CLA CMA /LOAD AC WITH 7777 SFFLG= 6156 /SKIP ON FRAME FLAG SKTF= 6142 /SKIP ON TAPE DONE FLAG SMODE= 6152 /SET SPECIAL MODE STSR= 6164 /SET SEARCH, CONDITIONALLY CLEAR AC PAGE /CAN ACTUALLY BE ANY PAGE! IFNZRO .&177 L7, 7 /CONSTANT 0007 DECTAPE,.-. /HANDLER ENTRY POINT NL0002 /SET INSTRUCTION FIELD BIT RDF /GET CALLING FIELD TAD LCDF /MAKE INTO CIF CDF RETURN INSTRUCTION DCA RETFLD /STASH FOR LATER USE INITZAP,JMS INIT1 /**** INITIALIZED **** 0000 BASE1, TAD I DECTAPE /GET THE ARGUMENT LIST ADDRESS DCA TRYCNT /SAVE IT TAD I TRYCNT /GET THE TRANSFER ADDRESS DCA BUFFER /SAVE IT ISZ TRYCNT /BUMP TO NEXT TAD I TRYCNT /GET THE FUNCTION WORD DCA FUNCTION /SAVE IT ISZ TRYCNT /BUMP TO NEXT TAD I TRYCNT /GET THE BLOCK NUMBER DCA BLOCK /SAVE IT ISZ DECTAPE /BUMP PAST ARGUMENT POINTER RIF /GET OUR FIELD TAD LCDF /MAKE INTO CDF OUR FIELD DCA OURFL1 /SAVE IN-LINE OURFL1, .-. /WILL BE CDF OUR FIELD TAD OURFL1 /GET CDF TO OUR FIELD DCA I POURF2 /STORE WHERE NEEDED TAD FUNCTION /GET THE FUNCTION WORD RAR /MOVE UNIT [0-1] TO AC[10-11] AND L3 /ISOLATE IACF /LOAD EXTENDED UNIT BITS NL7775 /SETUP THE DCA TRYCNT /RETRY COUNTER TAD FUNCTION /GET THE FUNCTION WORD AGAIN LDUW /LOAD LOWER UNIT BIT AND READ/WRITE FLIP-FLOP RAL /MOVE OVER AND DL7600 /ISOLATE PAGE BITS DCA PAGCNT /SAVE AS PAGE COUNT SNL /WRITING? TAD RDIFF /NO, MAKE IT READ ULTIMATELY TAD WRINST /GET WRITE-CAUSING INSTRUCTION DCA I PRWZAP /STORE IN-LINE FOR LATER TAD FUNCTION /GET FUNCTION WORD AGAIN L200, AND L7 /JUST UNIT BITS TAD TADBLK /NOW HAVE "TAD BLKN" INSTRUCTION DCA GETBLK /STORE IN-LINE FOR LATER TAD FUNCTION /GET FUNCTION WORD AGAIN AND L70 /JUST FIELD BITS TAD LCDF /MAKE INTO CDF TRANSFER FIELD DCA I PTRFL1 /STORE IN-LINE FOR LATER TAD I PTRFL1 /GET IT BACK DCA I PTRFL2 /STORE IN-LINE ELSEWHERE AS WELL GETBLK, .-. /WILL BE "TAD BLKN" CIA /INVERT IT TAD BLOCK /COMPARE TO DESIRED BLOCK TAD LOVSHT /ADD ON OVERSHOOT FACTOR IOF /PREVENT PROBLEMS JMP I PSAVDIR /START UP THE SEARCH THERE SUMCHK, SZA CLA /PARITY ERROR? JMP DTERR /YES, COMPLAIN NL2000 /NO, GET DCA-TAD TAD GETBLK /NOW HAVE "DCA BLKN" DCA PUTBLK /STORE IN-LINE FOR LATER TAD BLOCK /GET CURRENT BLOCK PUTBLK, .-. /WILL BE "DCA BLKN" TAD BUFFER /GET CURRENT BUFFER POINTER TAD L200 /UPDATE BY ONE BLOCK'S WORTH DCA BUFFER /STORE IT BACK ISZ BLOCK /BUMP TO NEXT BLOCK TAD PAGCNT /GET CURRENT PAGE COUNT TAD DL7600 /DECREMENT BY A PAGE SNA /ANY LEFT TO DO? JMP DTEXIT /NO, WE'RE DONE! DCA PAGCNT /YES, SAVE UPDATED VALUE JMP I PNXTBLK /GO DO ANOTHER BLOCK DTERR, ISZ TRYCNT /TOO MANY ERRORS? JMP I PDTURNX /NO, TRY AGAIN JMP DTSTOP /YES, BARF! DTEXIT, ISZ DECTAPE /BUMP TO SUCCESSFUL RETURN LCDF, CDF 00 /THIS CAN BE SKIPPED DTSTOP, ICON /STOP THE TAPE DRIVE RETFLD, .-. /WILL BE CIF CDF RETURN FIELD JMP I DECTAPE /RETURN TO CALLER BLK0, /BLOCK REMEMBERING TABLE INIT1, .-. /INITIALIZE ONCE-ONLY ROUTINE DCA INITZAP /PREVENT FURTHER USE INGET1, TAD PINIT2 /GET AN ADDRESS SPA /SKIP IF VALID JMP DL7600 /JUMP IF END TAD INIT1 /RELOCATE TO ABSOLUTE VALUE INPUT1, DCA PINIT2 /STORE IT BACK ISZ INGET1 /BUMP TO NEXT ADDRESS FUNCTIO,ISZ INPUT1 /BUMP TO NEXT ADDRESS TRYCNT, JMP INGET1 /GO DO ANOTHER PINIT2, INIT2-BASE1 /POINTER TO SECOND PAGE INITIALIZER PINIT3, INIT3-BASE1 /POINTER TO THIRD PAGE INITIALIZER POURF2, OURFL2-BASE1 /WHERE TO PUT CDF OUR FIELD INSTRUCTION PRWZAP, RWZAP-BASE1 /WHERE TO SETUP READ OR WRITE PTRFL1, TRFL1-BASE1 /WHERE TO SETUP CDF TRANSFER FIELD PTRFL2, TRFL2-BASE1 /LIKE-WISE PSAVDIR,SAVDIR-BASE1 /WHERE TO STARTUP FIRST TIME IN DESIRED DIRECTION PNXTBLK,NXTBLK-BASE1 /WHERE TO STARTUP ADDITIONAL BLOCKS GOING FORWARD PDTURNX,DTURNX-BASE1 /WHERE TO TURN THE TAPE AROUND;USED TO /START BACKWARDS AFTER A PARITY ERROR DL7600, CLA!400 /CLEAN UP;THIS ENDS THE RELOCATION LIST PAGCNT, JMS I PINIT2 /INITIALIZE SECOND PAGE BUFFER, JMS I PINIT3 /INITIALIZE THIRD PAGE BLOCK, JMP I INIT1 /BACK TO MAIN-LINE CODE LOVSHT, 7771 /OVERSHOOT FACTOR L3, 3 /CONSTANT 0003 L70, 70 /CONSTANT 0070 RDIFF, RDINST-WINST /READ DIFFERENCE CONSTANT TADBLK, TAD BLK0 /"TAD BLK0" INSTRUCTION WRINST, WINST /WRITE CONSTANT PAGE DECIDE, SPA CLA /GOING PROPER DIRECTION? DTURNX, NL4000 /NO, INVERT THE PREVAILING DIRECTION TAD DIRECT /NOW HAVE DESIRED NEW DIRECTION SAVDIR, DCA DIRECT /STORE IT BACK NXTBLK, STSR /FORCE SEARCH MODE, TURN OFF WRITERS, PERHAPS CLEAR AC TAD DIRECT /GET DESIRED DIRECTION CMA /INVERT SENSE AS DECTAPE IS CONSIDERED /BACKWARDS ON LINC-8 CONTROLLER! ACMN /LOAD MOTION FLIP-FLOPS SPA CLA /ARE WE ACTUALLY GOING BACKWARDS? TAD L20 /NO, ADD ON CML BIT TAD LRAL /ADD ON RAL INSTRUCTION DCA BITSHFT /SETUP DECODER POLARITY TAD DIRECT /GET CURRENT DIRECTION SPA CLA /SKIP IF SAME AS DESIRED (FORWARD) TAD L4002 /GET UNDERSHOOT FACTOR DCA USHOOT /THIS WILL MAKE IT UNDERSHOOT BEFORE /TURNING AROUND IF SEARCHING BACKWARDS NL0001 /SETUP FOR INVERSION SMODE /DISABLE NORMAL MARK WINDOW, INVERT /TIMING TRACK POLARITY FOR DECTAPE NL7777 /GET RESET VALUE FOR MARK WINDOW MRKWAIT,DCA MRKWIND /SAVE CURRENT WINDOW SFFLG /WAIT FOR JMP .-1 /A NEW BIT ITAC /GET IT RAR /PUT INTO LINK CLA /CLEAN UP TAD MRKWIND /GET CURRENT WINDOW BITSHFT,RAL /**** FORWARD SEARCH **** CML RAL TAD BLKMARK /COMPARE TO BLOCK MARK SNA /SKIP IF OTHER THAN BLOCK MARK JMP BLKSYNC /JUMP IF ON BLOCK MARK TAD ENDZONE /COMPARE TO END MARK SNA /SKIP IF OTHER THAN BLOCK OR MARK JMP DTURNX /TURN TAPE AROUND ON END MARK TAD RESTORE /RESTORE CURRENT WINDOW JMP MRKWAIT /TRY AGAIN BLKSYNC,CLRLC /CLEAR LINE COUNTER TAD LICON3 /GET READ MODE VALUE ICON /GOTO READ DATA MODE CLTF /CLEAR AC, TAPE FLAG IAAC /GET BLOCK NUMBER JMS I PUNSCRM /UNSCRAMBLE IT LICON3, IACS /DISPLAY CURRENT BLOCK IN "S" REGISTER TAD USHOOT /ADD ON UNDERSHOOT FACTOR CIA /INVERT FOR COMPARISON TAD I PBLOCK /ADD ON DESIRED SZA /SKIP IF FOUND IN DESIRED DIRECTION (FORWARD) JMP DECIDE /JUMP IF NOT, SIGN TELLS WHAT TO DO NEXT JMP I PDATGO /CONTINUE THERE INIT2, .-. /SECOND PAGE INITIALIZE ROUTINE INGET2, TAD PUNSCRM /GET AN ADDRESS USHOOT, SNA /END OF LIST? JMP I INIT2 /YES, WE'RE DONE TAD INIT2 /RELOCATE TO ABSOLUTE VALUE INPUT2, DCA PUNSCRM /STORE IT BACK DIRECT, ISZ INGET2 /BUMP TO NEXT ADDRESS ISZ INPUT2 /BUMP TO NEXT ADDRESS MRKWIND,JMP INGET2 /GO DO ANOTHER ONE PUNSCRM,UNSCRM-BUFFER /POINTER TO UNSCRAMBLING ROUTINE PBLOCK, BLOCK-BUFFER /POINTER TO DESIRED BLOCK PDATGO, DATGO-BUFFER /WHERE TO PROCESS THE ACTUAL TAPE DATA WORDS 0 /THIS ENDS THE LIST BLKMARK,-2526 /BLOCK MARK CONSTANT ENDZONE,-2222+2526 /END MARK CONSTANT LRAL, RAL /RAL INSTRUCTION CONSTANT L20, 20 /CONSTANT 0020 L4002, 4002 /CONSTANT 4002 RESTORE,2222 /WINDOW RESTORATION VALUE PAGE DATGO, JMS DTWAIT /WAIT FOR JMS DTWAIT /TWO WORDS ITAC /CLEAR FLAG NOW SFFLG /WAIT FOR JMP .-1 /A LINE ITAC /CLEAR THE FLAG SFFLG /WAIT FOR JMP .-1 /A LINE CLRLC /CLEAR LINE COUNTER CLTF /CLEAR TAPE FLAG, AC LRWS /LOAD READ DATA MODE;IF WRITING THEN /ALSO TURN WRITERS ON AND SKIP NEXT JMS DTWAIT /WAIT FOR A WORD IF READING JMS DTWAIT /WAIT FOR CHECKSUM WORD AND L1463 /JUST USEFUL SIX BITS DCA CHKSUM /SAVE INITIAL CHECKSUM VALUE TAD BLKSZE /SETUP THE DCA WRDCNT /WORD COUNTER TAD I PBUFFER /GET THE TRANSFER ADDRESS DCA CURADD /SET IT UP TRFL1, .-. /WILL BE CDF TRANSFER FIELD RWZAP, TAD I CURADD /**** READING **** JMP READ JMS SCRMBL /SCRAMBLE THE DATA WORD JMS DTWAIT /WRITE IT OUT JMS EXOR /CHECKSUM IT READCOM,ISZ CURADD /BUMP TO NEXT NOP /JUST IN CASE ISZ WRDCNT /DONE A BLOCK YET? JMP TRFL1 /NO, GO BACK FOR MORE JMS DTWAIT /WAIT FOR WORD 129 TO HAPPEN JMS EXOR /INCLUDE IN CHECKSUM TAD CHKSUM /GET THE CHECKSUM CMA RTL /MOVE OVER ITSELF JMS EXOR /CHECKSUM THE CHECKSUM TAD CHKSUM /GET THE CHECKSUM AND L6314 /JUST THE SIX CHECKSUM BITS JMS DTWAIT /SEND TO TAPE IF WRITING JMS EXOR /CHECKSUM IT ALSO JMS DTWAIT /WAIT FOR WORD TO BE WRITTEN OUT IF NECESSARY BLKSZE, CLA!400 /CLEAN UP TAD CHKSUM /GET CURRENT CHECKSUM AND L6314 /JUST SIX CHECKSUM BITS JMP I PSUMCHK /FINISH CHECKING THERE READ, JMS DTWAIT /WAIT FOR A WORD JMS EXOR /CHECKSUM IT TAD SCRMBL /GET THE LATEST WORD BACK JMS UNSCRM /UNSCRAMBLE IT TRFL2, .-. /WILL BE CDF TRANSFER FIELD DCA I CURADD /STORE THE WORD JMP READCOM /CONTINUE THERE INIT3, .-. /SECOND PAGE INITIALIZE ROUTINE INGET3, TAD PBUFFER /GET AN ADDRESS CHKSUM, SNA /END OF LIST? SCRTMP, JMP I INIT3 /YES, WE'RE DONE WRDCNT, TAD INIT3 /RELOCATE TO ABSOLUTE VALUE INPUT3, DCA PBUFFER /STORE IT BACK TBLPTR, ISZ INGET3 /BUMP TO NEXT ADDRESS ISZ INPUT3 /BUMP TO NEXT ADDRESS CURADD, JMP INGET3 /GO DO ANOTHER ONE RDINST= JMP READ /NEEDED INSTUCTION VALUE WINST= TAD I CURADD /LIKE-WISE PBUFFER,BUFFER-BLOCK /POINTER TO BUFFER ADDRESS PSUMCHK,SUMCHK-BLOCK /POINTER TO PARITY CHECK ROUTINE PUNTBL, UNTBL-BLOCK /POINTER TO UNSCRAMBLING TABLE PSCRTBL,SCRTBL-BLOCK /POINTER TO SCRAMBLING TABLE DTWAIT, 0 /WORD WAIT ROUTINE;THIS ENDS THE RELOCATION LIST IACA /LOAD IN CASE WRITING SKTF /WAIT FOR JMP .-1 /A WORD CLTF /CLEAR TAPE FLAG, AC IAAC /GET BACK ORIGINAL OR NEW WORD IF READING JMP I DTWAIT /RETURN EXOR, .-. /EXCLUSIVE OR ROUTINE DCA SCRMBL /SAVE THE WORD TAD SCRMBL /GET IT BACK AND CHKSUM /REMOVE OVERFLOWS CLL RAL /*2 CIA /INVERT TAD SCRMBL /ADD ON ORIGINAL TAD CHKSUM /ADD ON CHECKSUM DCA CHKSUM /STORE IT BACK JMP I EXOR /RETURN L1463, 1463 /CONSTANT 1463 L6314, 6314 /CONSTANT 6314 L77, 77 /CONSTANT 0077 UNSCRM, .-. /READ UNSCRAMBLE JMS SCRCOM /DO COMMON STUFF TAD PUNTBL /ADD ON UNSCRAMBLE BASE DCA TBLPTR /STASH IT TAD I TBLPTR /GET TRANSLATED VALUE CLL RTL /SHIFTED 2 PLACES RTL /SHIFTED 4 PLACES RAL /SHIFTED 5 PLACES DCA SCRTMP /HIGH-LOW TABLES NOW OVERLAP ON 5 TAD EXOR /GET THE WORD BACK AND L77 /JUST TABLE SIZE TAD PUNTBL /ADD ON TABLE BASE DCA TBLPTR /STASH IT TAD I TBLPTR /GET VALUE TAD SCRTMP /COMBINE HALVES JMP I UNSCRM /RETURN SCRMBL, .-. /WRITE SCRAMBLE JMS SCRCOM /DO COMMON STUFF TAD PSCRTBL /ADD ON TABLE POINTER DCA TBLPTR /STASH IT TAD I TBLPTR /GET THE VALUE CLL RTL /SHIFTED 2 PLACES DCA SCRTMP /SAVE IT TAD EXOR /GET THE WORD AND L77 /JUST TABLE SIZE TAD PSCRTBL /ADD ON TABLE BASE DCA TBLPTR /STASH IT TAD I TBLPTR /GET VALUE TAD SCRTMP /COMBINE HALVES JMP I SCRMBL /RETURN SCRCOM, .-. /COMMON ROUTINE DCA EXOR /SAVE WORD OURFL2, .-. /WILL BE CDF OUR FIELD TAD EXOR /RETRIEVE WORD RTR /MOVE DOWN RTR /THE HIGH RTR /ORDER WORD AND L77 /JUST TABLE SIZE JMP I SCRCOM /RETURN PAGE UNTBL, 4466;4462;4426;4422;4066;4062;4026;4022 /UNSCRAMBLING TABLE 0466;0462;0426;0422;0066;0062;0026;0022 4464;4460;4424;4420;4064;4060;4024;4020 0464;0460;0424;0420;0064;0060;0024;0020 4446;4442;4406;4402;4046;4042;4006;4002 0446;0442;0406;0402;0046;0042;0006;0002 4444;4440;4404;4400;4044;4040;4004;4000 0444;0440;0404;0400;0044;0040;0004;0000 SCRTBL, 1463;1063;1443;1043;1462;1062;1442;1042 /SCRAMBLING TABLE 0463;0063;0443;0043;0462;0062;0442;0042 1423;1023;1403;1003;1422;1022;1402;1002 0423;0023;0403;0003;0422;0022;0402;0002 1461;1061;1441;1041;1460;1060;1440;1040 0461;0061;0441;0041;0460;0060;0440;0040 1421;1021;1401;1001;1420;1020;1400;1000 0421;0021;0401;0001;0420;0020;0400;0000