/SD8X NON-RESIDENT DECTAPE HANDLER /TWO PAGE, PAGE RELOCATABLE HANDLER FOR THE TD8E DECTAPE. /THIS HANDLER DRIVES UNITS 0,2,4,6 & 1,3,5,7 /AND HAS ENTRY POINTS AT LOCATIONS 10,11,12,13 /AND 14,15,16,17 RELATIVE TO THE LOAD POINT. /PARAMETER 'DRIVE' WILL SELECT WHICH GROUP IS ACTIVE /DEFAULT: DRIVE=0:SELECTS SDA0 AND SDA1 (E.P. 10 & 14) /THIS HANDLER CAN BE USED WITH ION SYSTEMS AND WILL /TURN THE INTERRUPT OFF FOR AT MOST 17MSECS AND THIS /ONLY DURING THE ACTUAL READ/WRITES.EXTRA FEATURES: /^C CHECKED IMMEDIATELY BEFORE READ/WRITE /BLOCKS LARGER THAN 2047 GIVE IMMEDIATE FATAL ERROR /NUMBER OF ERROR TRIES CAN BE CHANGED BY THE FOLLOWING: /$ALTER SD8A (TO SD8D), 1 /7775/-NUMBER OF TRIES /W.VAN DER MARK, ETH, ZUERICH 10/28/74 IFNDEF DRIVE UNITNO=DRIVE^10 VERSION="E-300 /THE IOT'S ARE: SDSS=6771-UNITNO/SKIP ON SINGLE LINE FLAG SDST=6772-UNITNO/SKIP ON TIME ERROR SDSQ=6773-UNITNO/SKIP ON QUAD LINE FLAG SDLC=6774-UNITNO/LOAD TAPE COMMAND REGISTER SDLD=6775-UNITNO/LOAD DATA REGISTER SDRC=6776-UNITNO/READ COMMAND REGISTER SDRD=6777-UNITNO/READ DATA REGISTER /DESCRIPTOR BLOCK *0 -2 /TWO DEVICES IFZERO DRIVE < DEVICE SD8A;DEVICE SDA0;4210;SDA0-200+4000;ZBLOCK 2 DEVICE SD8A;DEVICE SDA1;4210;SDA1-200+4000;ZBLOCK 2 > IFZERO DRIVE-1 < DEVICE SD8B;DEVICE SDA2;4210;SDA0-200+4000;ZBLOCK 2 DEVICE SD8B;DEVICE SDA3;4210;SDA1-200+4000;ZBLOCK 2 > IFZERO DRIVE-2 < DEVICE SD8C;DEVICE SDA4;4210;SDA0-200+4000;ZBLOCK 2 DEVICE SD8C;DEVICE SDA5;4210;SDA1-200+4000;ZBLOCK 2 > IFZERO DRIVE-3 < DEVICE SD8D;DEVICE SDA6;4210;SDA0-200+4000;ZBLOCK 2 DEVICE SD8D;DEVICE SDA7;4210;SDA1-200+4000;ZBLOCK 2 > *200 /UN1\REV\GO/WR\WLO\SELTIM/ C70, 70 /KEEP HERE! TRIES, -3 /OR SOME OTHER NUMBER IFNZRO DRIVE < TC3, 3 IFNZRO DRIVE-1 < C6201, CDF 0 IFNZRO DRIVE-2 < CION, ION >>> CTC8LN, CTCLN8-BASE CSELCT, SELECT-BASE CRDW, RDWRT-BASE /FRW:TAR.GT.READ:L=1 - .LT.:L=0 NTFOUN, SZL /REV:TAR.GT.READ:L=0 - .LT.:L=1 JMP TSRCH /RIGHT DIRECTION - GO ON JMP REVRS /WRONG - SIGN SHOWS THE WAY SDA0, VERSION /ENTRY FOR UNIT 0 CLA CLL JMP SDA1X M20, -20 /FILLER WORD SDA1, VERSION /ENTRY FOR UNIT 1 CLA CLL CML C1000, TAD SDA1 /ALSO CONSTANT 1000 DCA SDA0 /PICK UP ARGS AT SDA0 SDA1X, RAR DCA UNIT /UNIT # FROM LINK RDF TAD C6203 DCA LEAVE /SET UP EXIT FROM HANDLER REENTR, JMS INIT /BECOMES 'TAD I SDA0' BASE, SDLD /SAVE FUNCTION WORD IN REG. C200, AND C70 /ISOLATE FIELD OF TRANSFER TAD C6201 DCA XFIELD SDRD /GET FUNC. AGAIN CLL RAL C374, AND CM200 /GET A PAGE COUNT DCA PGCT ISZ SDA0 /POINT TO BUFFER CTADI, TAD I SDA0 DCA BUFF ISZ SDA0 /POINT TO RECORD TAD I SDA0 CLL RAL /CONVERT TO DECTAPE BLOCKS DCA TBLOCK ISZ SDA0 /POINT TO ERROR RET. SZL /SHOULD SKIP FOR LEGAL BLOCK JMP FATAL TAD TRIES DCA ERCNT /X ERROR TRIES TAD UNIT /INITIALIZE AND JMS I CSELCT /CHECK FOR SELEC ERROR JMP .-2 /LOOPS IF NO ^C AND SELECT ERROR JMP GO /OK,START THE SEARCH - LNK IS SET TRWCOM, IOF /OR 'ION' - NEXT WILL EXECUTE SDST /TIME OR CHECK SUM ERROR? SZA CLA /LNK OFF AT TRWCOM JMP TRY3 /YES TRY UP TO 3 TIMES TAD PGCT /NO.. IS PAGE COUNT EXHAUSTED? TAD CM200 /TURNS LINK ON SNA JMP EXIT /YES.. DONE THIS TRANSFER DCA PGCT /NEW PAGE COUNT ISZ TBLOCK TAD BUFF TAD C200 /GET NEW BUFFER ADDRESS DCA BUFF REVRS, SPA /IF TAR.GT.READ CLL CML /FORCE FORWARD MOTION GO, CLA CML RTR /PUT IN DIRECTION BIT TAD C1000 TAD UNIT SDLC /INITIATE THE MOTION JMS I CTC8LN /WAIT FOR 8 LINES TO PASS NOP /AND CHECK FOR CTRL/C TSRCH, CIF CDF 0 /TURN OFF INT. IN SKIP CHAIN SDSS /WAIT FOR BLOCK MARK OR END ZONE JMP TSRCH SDRC /FORWARD:LNK=0 CLL RTL /DIRECTION TO LINK, DATA TO AC 4-9 AND C374 /ISOLATE M.T BITS TAD M110 /IS IT END ZONE? SNA /FORWARD:LNK=1 JMP ENDZ /YES..DO SOMETHING REASONABLE TAD M20 /HOW ABOUT BLOCK MARK? SZA CLA /FORWARD:LNK=0 JMP TSRCH /NEITHER..KEEP LOOKING SDRD /WHAT IS THIS BLOCK'S #? SZL /IF IN REVERSE, LOOK FOR 3 BEFORE TAD TC3 /THE ACTUAL TARGET BLOCK CMA /-READ(-3)-1 TAD TBLOCK /CML IF TAR.GT.READ(+3) CMA /READ(+3)-TAR SZA /IS THIS THE BLOCK? JMP NTFOUN /NO - GO CHECK LNK AND SIGN SZL CLA /FOUND BLOCK - DIRECTION? JMP GO /WRONG - TURN AROUND TAD CION /LOAD 'ION' INST. SKON /IF INT. ON - TURN OFF AND SKIP IAC /=IOF DCA TRWCOM /SAVE INSTR. SDRC /CLEAR FLAGS-GET UNIT,FORWARD,GO SDLC /CLEAR RESIDUAL TIMING ERRORS TAD BUFF XFIELD, HLT /GETS CDF N JMS I CRDW /LETS TRANSFER DATA JMP TRWCOM ENDZ, CML IAC /MAKE FORWARD: LNK=0 M110, CLA SNA SZL /IAC ALLOWS 'SNA' JMP GO /EXECUTE TURN AROUND AND SEARCH /END ZONE FORWARD - ERROR TRY3, ISZ ERCNT /TRIED 3 TIMES? JMP GO /LINK IS ZERO FATAL, CLL /YES.. TAKE FATAL RETURN SKP CLA EXIT, ISZ SDA0 /NORMAL RETURN TAD UNIT /STOP TAPE FIRST SDLC CLA CML RAR /EITHER 0 OR 4000 IN AC LEAVE, HLT /GETS CIF CDF N JMP I SDA0 INIT, HLT /FIND OUT WHERE WE GOT LOADED INITAD, TAD CTC8LN SPA /MINUS ENDS LIST BUFF, JMP CM200 TBLOCK, TAD INIT PGCT, DCA CTC8LN ERCNT, ISZ .-1 ISZ INITAD JMP INITAD IFNZRO DRIVE-3 < CION, ION IFNZRO DRIVE-2 < C6201, CDF 0 IFNZRO DRIVE-1 < TC3, 3 >>> *374 /KEEP CM200 HERE! CM200, 7600 /CLA! TAD CTADI /RESTORE DCA REENTR JMP REENTR UNIT=SDA1 C6203=TSRCH PAGE XBUFF, 0 /KEEP XBUFF AND EFUN HERE! EFUN, 0 /EQUIVALENCE CHECKSUM DCA ETMP/ORIGINAL WORD IS KEPT TAD ETMP/19MMSEC SUB MQA /X.OR.C CMA CLL /.NOT.(X.OR.C) - LNK TO TRWCOM SWP /C IN AC-(.NOT.X).AND.(.NOT.C) IN MQ AND ETMP/X.AND.C MQA /(X.AND.C).OR.((.NOT.X).AND.(.NOT.C)) MQL /CLEAR AC AND RELOAD CHECKSUM JMP I EFUN RDWRT, 0 DCA XBUFF JMS CTCCHK /WE CAN STILL PREVENT A WRITE RGRD, SDSS JMP .-1 /LOOK FOR REVERSE GUARD PATTERN SDRC /IT TAKES AT MOST 25MMSEC TO GET HERE AND K77 TAD CM32 SZA CLA /IF NOT REV. GUARD, KEEP LOOKING JMP RGRD TAD C7600 DCA WORDS /128 WORDS/BLOCK TAD XFUNCT K7700, SMA CLA /IS IT READ OR WRITE? JMP TREAD SDRC /CHECK FOR WRITE LOCKOUT AND TC300 /17MMSEC TO HERE CLL /SETUP TO RETRY IF WRITE LOCK SZA /KEEP AC ON FOR ERROR JMP I RDWRT /IF LOCKED OUT, ERROR JMS R4LINE /SKIP A WORD;LOCK MARK CLA /NEXT QUADFLAG SET AFTER TAD WRTLP /START OF CHECKSUM TAD XUNIT SDLC /TURN ON WRITE HEAD MQL /ZERO TO CHECKSUM TAD K77 /0077 IN REV. CHECKSUM JMS W4LINE /GIVES 7700 CK:.NOT.EQU OF ALL WRTLP, TAD I XBUFF JMS W4LINE ISZ XBUFF /INCREMENT BUFF. ADD. K77, 77 /38MMSEC LOOP ISZ WORDS /DONE A BLOCK? JMP WRTLP JMS W4LINE /A 129 TH WORD OF 0 JMS GCHK /GET 6 BIT CHECKSUM AND K7700 JMS W4LINE /WRITE IT TO TAPE JMS W4LINE /LET CHECK SUM FINISH JMP I RDWRT /SEE IF WE ARE FINISHED TREAD, JMS R4LINE /LOCK MARK JMS R4LINE /END LOCK,START CHECKS. JMS R4LINE /SKIP CONTROL WORDS AND K77 /.NOT. CK MQL RDLP, JMS R4LINE DCA I XBUFF ISZ XBUFF TC300, 300 /39MMSEC LOOP ISZ WORDS /DONE BLOCK? JMP RDLP JMS R4LINE /CHECK SUM 129 TH WORD JMS R4LINE /READ CHECKS. AND HALF NONSNS AND K77 /.NOT.CK,ELIMINATES SECOND HALF JMS EFUN JMS GCHK /COMPARE TAPE AND OUR CHECKSUM JMP I RDWRT /80MMSEC TO SDST W4LINE, 0 /ADD TO CHECKSUM, WRITE A 12 BIT SDSQ /WORD JMP .-1 /SKIP ON QUAD LINE FLAG SDLD /25MMSEC SUB JMS EFUN JMP I W4LINE R4LINE, 0 /WAIT FOR QUAD FLAG AND READ SDSQ JMP .-1 SDRD /27MMSEC SUB JMS EFUN TAD ETMP JMP I R4LINE GCHK, 0 /FORM 6 BIT CHECKSUM MQA CLA BSW JMS EFUN /28MMSEC SUB MQA JMP I GCHK SELECT, 0 /THIS ROUTINE CHECKS FOR SELECT DCA XUNIT /INITIALIZES TAD XUNIT /AND CHECKS FOR ^C TYPED SDLC SDRD /5MMSEC SETTLE DCA XFUNCT SDRC /SEE IF SELECT ERROR ON AND C100 SNA CLA ISZ SELECT /NOPE .TAKE NORMAL OUT JMS CTCCHK SELEX, SDRD RAR /INITIAL DIR. TO LNK C7600, 7600 /CLA JMP I SELECT CTCCHK, 0 KSF /SEE IF FLAG IS UP JMP I CTCCHK /NO..EXIT TAD C7600 KRS TAD M7603 /IS IT A ^C? SZA CLA JMP I CTCCHK CDF 0 IOF TAD XUNIT SDLC /MAKE SURE TAPE IS STOPPED JMP I C7600 /YES - BACK TO KM. C100, 100 M7603, -7603 CM32, -32 XFUNCT, 0 WORDS, 0 ETMP, 0 XUNIT, 0 CTCLN8, 0 /WAIT FOR 8 LINES AND CHECK CTRL/C JMS R4LINE JMS R4LINE JMS CTCCHK JMP I CTCLN8 $$$$