File: SDA.PA of Tape: Sources/RTS/s3
(Source file text)
/SDA "REAL-TIME" HANDLER /ACCEPTS STANDARD MASS STORAGE TASK MESSAGE FORMAT /THIS HANDLER DRIVES UNITS 0,2,4,6 & 1,3,5,7 /PARAMETER 'DRIVE' WILL SELECT WHICH GROUP IS ACTIVE /DEFAULT: DRIVE=0:SELECTS SDA0 AND SDA1 /BLOCKS LARGER THAN 2047 GIVE IMMEDIATE FATAL ERROR /NUMBER OF ERROR TRIES CAN BE CHANGED. /THE MQ IS USED FOR CHECKSUM COMPUTATION /AND IT WILL HOLD A TC08 COMPATIBLE STATUS /AT THE END OF A DECTAPE TRANSFER. /THE SYSTEM CLOCK WILL LOSE SOME TICKS /DURING THE ACTUAL DATA TRANSFER DUE TO /SWITCHING OFF OF THE INTERRUPT ENABLE. /THIS SWITCHING OFF WILL LAST AT MOST 17MSECS. /W.VAN DER MARK, ETH, ZUERICH 10/1/76 IFNDEF DRIVE <DRIVE=0> UNITNO=DRIVE^10 /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 TASK= SDA INIWT= 0 CUR= 0 SDTICS= SHERTZ%100 /BLOCK TIME= 15 MSECS IFZERO SDTICS <TAPERR, -ERROR-> /WRONG CLOCK RATE SDTICS=SDTICS+1 /THE REAL-TIME CLOCK IS ASYNCHRONOUS UTSTIM= SHERTZ%6-SDTICS /UP-TO-SPEED TIME = 170 MS FIELD CUR%10 *3600 /MAIN HANDLER LOOP START, IFDEF PWRF< CAL SEND PWRF DRLADR > LOOP, CAL RECEIV /GET A MESSAGE SADDR, 0 DCA FLD DTREDO, TAD SADDR DCA ADDR TAD TRIES DCA I (ERCNT /TRY X TIMES JMS GET AND C1 /ALLOW ONLY 2 UNITS. SDLD TAD (260 DCA MUNIT /STORE UNIT IN MESSAGE SDRD CLL RTR DCA UNIT TAD UNIT DCA I (WUNIT JMS GET SDLD /PUT FUNCTION IN REG. AND C70 TAD C6201 DCA I (XFIELD SDRD /GET FUNCTION CLL RAL AND CM200 DCA I (PGCT JMS GET DCA I (BUFF /GET OS/8 STYLE ARGS JMS GET CLL RAL DCA I (TBLOCK /DOUBLE BLOCK NUMBER SZL JMP FATAL /BLOCK # TOO BIG. ERROR: 0000 TAD UNIT /TRANSFER UNIT AND FUNCTION JMS I (SELECT /TO THIRD PAGE JMP I (STARTS /OK LETS SEARCH /** FALL INTO NEXT PAGE /SELECT ERROR: 400 FATAL, CLL CML RAR /SET ERROR BIT AND SHIFT IN POSITION EXIT, DCA STATUS /NORMAL RETURN TAD UNIT /STOP TAPE FIRST SDLC TAD FLD /THIS JUST SETS THE DF DCA .+1 HLT TAD STATUS DCA I ADDR TAD FLD DCA PFLD AC7775 TAD SADDR /GET POINTER TO MESSAGE EVENT FLAG CAL POST STATUS, PFLD, HLT JMP LOOP /GET ANOTHER MESSAGE GET, 0 FLD, HLT TAD I ADDR ISZ ADDR CDF CUR JMP I GET DERSDA, 0 /DERAIL SUBROUTINE TAD .-1 /IF WE WERE WAITING: WAIT TAD (-LOOP /IF EXECUTING: RESTART ALL SNA CLA JMP LOOP JMP DTREDO UNIT, 0 ADDR, 0 CM200, -200 C70, 70 C1, 1 C6201, CDF 0 TRIES, -3 ANSWER, ZBLOCK 2 DRLADR, ZBLOCK 3 DERSDA READYM, ZBLOCK 3 6001 ANSWER "R;"E;"A;"D;"Y;" ;"S;"D;"A; MUNIT, 0;0 PAGE C374, 374 /KEEP THIS CONSTANT HERE! TC3, 3 M20, -20 CLKMES, ZBLOCK 5 /CLOCK MESSAGE CLRATE, SDTICS BLKTAB, ZBLOCK 2 /TAPES START REWOUND /FRW:TAR.GT.READ:L=1 - .LT.:L=0 NTFOUN, SZL /REV:TAR.GT.READ:L=0 - .LT.:L=1 JMP TSRCL /RIGHT DIRECTION - GO WAIT REVRS, SPA /IF TAR.GT.READ CLL CML /FORCE FORWARD MOTION GO, CLA CML RTR /PUT IN DIRECTION BIT TAD C12XX TAD WUNIT SDLC /INITIATE THE MOTION TAD (UTSTIM /WAIT FOR UTS TO CLEAR (+-170MS) SKP TSRCL, CLA CLL TAD (SDTICS DCA CLRATE CAL /WAIT FOR ONE BLOCK SENDW /AND HOPE TO CATCH NEXT ONE CLOCK CLKMES TSRCH, IOF SDRC /CLEAR FLAGS SDSS JMP .-1 /SYNCHRONIZE WITH DTP1 SDRC /LOOK FOR BLOCK MARK OR END ZONE ION /ION...BUT CIF CDF CUR /TURN OFF INT. IN SKIP CHAIN CLL RTL /DIRECTION TO LINK, DATA TO AC 4-9 /FORWARD:LNK=0 C200, 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 #? DCA I RBLOCK /REMEMBER BLOCK #'S TAD I RBLOCK /FOR NEXT MESSAGE SZL /IF IN REVERSE, LOOK FOR 3 BEFORE C12XX, 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 /** FALL INTO NEXT PAGE IOF /IOF NOW TO PREVENT MORE TIMING ERRS TAD BUFF /CLOCK WILL LOSE SOME TICKS XFIELD, HLT /GETS CDF N JMS I (RDWRT /LETS TRANSFER DATA SDST /TIME OR CHECK SUM ERROR? SKP TAD C200 /TIMING ERROR. ERROR 100 MQL /SAVE STATUS FOR DISPLAY IN MQ SDRC AND (7000 /BE SURE TO CLEAR WRITE BIT SDLC ION /NEXT WILL EXECUTE MQA CLA /GET STATUS BACK INTO AC SZA /LNK OFF AT TRWCOM JMP TRY3 /YES TRY UP TO X TIMES TAD PGCT /NO.. IS PAGE COUNT EXHAUSTED? TAD (-200 /TURNS LINK ON SNA JMP I (EXIT /YES.. DONE THIS TRANSFER DCA PGCT /NEW PAGE COUNT ISZ TBLOCK TAD BUFF TAD C200 /GET NEW BUFFER ADDRESS DCA BUFF JMP TSRCH ENDZ, CML IAC /MAKE FORWARD: LNK=0 M110, CLA SNA SZL /IAC ALLOWS 'SNA' JMP GO /EXECUTE TURN AROUND AND SEARCH CML RTR /END ZONE FORWARD - ERROR 1000 TRY3, ISZ ERCNT /TRIED 3 TIMES? JMP GO /LINK IS ZERO JMP I (FATAL STARTS, TAD WUNIT /GET UNIT FROM MESSAGE CLL RTL TAD (BLKTAB DCA RBLOCK /SET INDIRECT POINTER TAD I RBLOCK /MEMORY OF TAPE POSITION. TAD (12 /START FORWARD IF 'TBLOCK' POSITIONED CMA CLL /MORE THAN 10 BLOCKS IN TAD TBLOCK /FRONT OF 'RBLOCK' JMP GO /LINK SET MEANS FORWARD BUFF, 0 TBLOCK, 0 PGCT, 0 WUNIT, 0 RBLOCK, 0 ERCNT, 0 PAGE XBUFF, 0 /KEEP XBUFF 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 SDRC /CLEAR FLAGS-GET UNIT,FORWARD,GO SDLC /CLEAR RESIDUAL TIMING ERRORS RGRD, SDSS /40MMS FROM DTP1 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 RAL /SETUP TO RETRY IF WRITE LOCK SZA /KEEP AC ON FOR ERROR 200 + (100) JMP I RDWRT /IF LOCKED OUT, ERROR JMS R4LINE /SKIP A WORD;LOCK MARK C7600, 7600 /NEXT QUADFLAG SET AFTER TAD WRTLP /START OF CHECKSUM TAD XUNIT /35MMS FROM QUAD-LINE FLAG 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 SDSQ /LET CHECK SUM FINISH JMP .-1 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 SZA CLA TAD (400 /PARITY ERROR: 200 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 /AND INITIALIZES TAD XUNIT SDLC SDRD /5MMSEC SETTLE DCA XFUNCT SDRC /SEE IF SELECT ERROR ON AND C100 SNA CLA JMP I SELECT /OK-YOU ARE VERY SELECTIVE CAL SENDW TTY READYM /TELL HIM TO BE NARROW-MINDED SDRC AND C100 /MAYBE HE DIDN'T LIKE THIS! CLL RTL RAL SZA ISZ SELECT /SELECT ERROR: 400 JMP I SELECT /HE DID LIKE IT C100, 100 CM32, -32 XFUNCT, 0 WORDS, 0 ETMP, 0 XUNIT, 0 $$$$