File TD.TK

Directory of image this file is from
This file as a plain text file

/******* MULTI8 TD8E TAPE-DRIVER *******
/LAST EDIT: 15-JULY-75, JV
/CREATED: 9-MAY-75, JV

/PROGRAM NAME: TD	/TD8E TAPE DRIVER
/NAME:	"D^100+"T&3777	/DT (FOR MODULARITY)
/LENGTH: 3 PAGES
/FUNCTION: TO HANDLE TD8E-TAPE TRANSFERS. IT CAN DO A
/	SEARCH-ONLY AND A SEARCH-AND-TRANSFER.
/	THE TRANSFER CANNOT BE DONE IN A REAL-TIME ENVIRON-
/	MENT. IT NEEDS TO TURN OFF THE INTERRUPT-ENABLE FOR
/	AT LEAST 20 MS, WHICH IS TOO FAST TO SEE IT ON THE
/	TELETYPE, BUT FAR TOO SLOW FOR MOST REAL-TIME APPLI
/	CATIONS. SO USE IT WITH CARE. (MAYBE WE WILL MAKE A
/	PROTECTION LATER.) THE DATA TRANSFER VECTOR RESEM-
/	BLES THAT OF OS8 EXCEPT FOR THE UNIT NUMBER AND THE
/	MEANING OF THE LINK, GIVING THE INITIAL DIRECTION.
/CONCEPT: DURING A SEARCH FOR THE STARTING BLOCK OF THE
/	TRANSFER EVERYTHING CAN GO ON, INCLUDING INTER-
/	RUPTS. WHEN A TRANSFER IS DONE, INT.ENAB. IS TURNED
/	OFF AND REAL TIME WORK IS IMPOSSIBLE. HOWEVER, EVE-
/	RYTHING STAYS AS IT IS, SO YOU JUST LOOSE A COUPLE
/	OF INTERRUPTS, DEVICES  WILL "HESITATE" ETC.
/	A TRANSFER OF LENGTH 0 IS IN OS8 OFTEN INTERPRETED
/	AS A TRANSFER OF 40 PAGES, IN THIS MODULE HOWEVER
/	AS A SEARCH-ONLY.
/ERRORS: NO ERRORS KNOMN AT THE MOMENT
/
/USE:	TAD (-3
/	DCA TRYCNT
/AGAIN,	CDF FIELD OF DTV
/	TAD (POINTER TO DTV
/	JMS MONITOR
/	   CALL
/	   "D^100+"T&3777	/DT
/	 JMP TWAIT	/BUSY;AC UNCHANGED;WAIT A FEW SEC.
/	DCA SLOT	/NORMAL RETURN;SLOT # IN AC
/	JMS MONITOR	/WAIT FOR COMPLETION OR ERROR
/	   WAIT
/SLOT,	   0
/	SZA CLA		/ERROR ?
/	 JMP TRY	/YES
/	ETC.
/
/TRY,	ISZ TRYCNT	/TRIED 3 TIMES ?
/	 JMP AGAIN	/NOT YET
/	ETC.		/YES,GO TO ERROR RETURN
/
/TWAIT,	JMS MONITOR	/WAIT A FEW SEC.
/	   STALL	
/	   ...		/BETTER MUCH MORE THEN 1.
/	JMP AGAIN
/FORMAT OF DATATRANSFERVECTOR (DTV):
/DTV,	RLL.LLL.FFF.UUU /R/W;LENGTH(PAGES);FIELD;UNIT
/	BUFFER ADDRESS IN CORE
/	BLOCK # ON TAPE

/USE OF ZTEM-REGISTERS:
DTV=X		/POINTER TO DATA-TRANSFER-VECTOR
DTCNT=ZTEM1	/COUNTER FOR TIMEOUT OF QUAD LINES
DTETMP=ZTEM2	/EFUN TEMPORARY
DTDIFB=ZTEM3	/DIFFERENCE # BLOCKS (COMPUTE STALL)
DTRWFL=ZTEM4	/R/W-FLAG
DTCNT2=ZTEM5	/COUNTER OF WORDS PER BLOCK
DTCSUM=ZTEM6	/CHECKSUM
DTCNT1=ZTEM7	/COUNTER OF LINES BETWEEN BLOCKS
DTXADR=AUTO10	/CURRENT ADDRESS REGISTER

/OTHER REGISTERS WITHIN THIS MODULE, BECAUSE THEY MUST KEEP
/THEIR VALUE THROUGHOUT MONITOR CALLS:
O=DTFUN	/FUNCTION WORD (SEE NEXT PAGE)
O=DTADR	/STARTING ADDRESS OF CURR./NEXT BLOCK IN CORE
O=DTNUM	/MINUS # OF BLOCKS TO BE TRANSFERED YET
O=DTBLK	/MINUS (STARTING) BLOCK -1 ON TAPE
O=DTFLD	/CDF BUFFER FIELD
O=DTPRCN/COUNTER OF PRECEDE'S DURING/AFTER A UTS-DELAY
O=DTRYCN/NUMBER OF TRIES ON ERROR
O=DTADR1/REMEMBER DTADR FOR RETRY ON ERROR
O=DTBLK1/REMEMBER DTBLK FOR RETRY ON ERROR

/PARAMETERS:
DTQDNM=100	/TIMEOUT FOR SDSQ; JMP .-1

SDSS=6771	/SKIP ON SINGLE LINE FLAG
SDST=6772	/SKIP ON TIME ERROR
SDSQ=6773	/SKIP ON QUAD LINE FLAG
SDLC=6774	/LOAD TAPE COMMAND REGISTER
SDLD=6775	/LOAD DATA REGISTER
SDRC=6776	/READ COMMAND REGISTER
SDRD=6777	/READ DATA REGISTER

DTFUN, "D^100+"T&3777 /NAME DT DTADR, 600 /3 PAGES, NO CONNECT CDTCLR, DTCLR CDTXFR, DTXFR CDTBLK, DTBLK DTNUM, 0 DCA DTV TAD I DTV //DF IS FIELD OF DTV CML RTR //NOW BIT 0: UNIT # DCA DTFUN // BIT 1: INITIAL DIRECTION // BIT 2: (NOT BIT 3) READ/WRITE // BIT 3-7: # OF PAGES ISZ DTV // BIT 8-10: FIELD OF TRANSFER TAD I DTV DCA DTADR1 //STARTING CORE-ADDRESS ISZ DTV TAD I DTV //STARTING OS8-BLOCK ON TAPE DCA DTBLK1 CDTOIF CIF MONFLD JMS I ZRESERV /RESERVE A SLOT # FOR COMMUNICATION /WITH THE CALLING TASK. JMS ALARM /NO SLOTS AVAILABLE JMS MONITOR /TELL THE CALLING TASK, RETURN+CONTINUE /WHERE HE CAN WAIT FOR DCA DTSLOT /AC PRESAVED THROUGH MONITOR CALL ACM3 /MAKES LINK=1 DCA DTRYCN /TRY 3 TIMES TAD DTBLK1 /IF BLOCK # .LT.0 OR .GT.1340 TAD (-1341 /THERE MUST BE AN ERROR SNL CLA /TEST FOR LEGAL CALL JMP DTFATR /BLOCK # > 1340, FATAL ERROR DTRTRY, TAD DTADR1 /HERE ALSO FOR RETRY ON ERROR DCA DTADR TAD DTBLK1 STL CMA RAL /MINUS STARTING TAPEBLOCK(PAGE)-1^2 DCA I CDTBLK /DATAFIELD = CURR. INSTR. F. TAD DTFUN AND DT6001 /ONLY UNIT- & DIRECTION-BITS IOF ///IF AN INTERRUPT COMES BETWEEN SDLC ///SDLC AND SDRC, IT WILL CAUSE DT6001, ION ///A TIME-ERROR. SDRC /// AND (100 /TIME- OR SELECT-ERROR ? SZA CLA JMP DTERR /PROBABLY SELECT ERROR SDRC /GET UNIT # & DIR. /STOP/GO & R/W BITS ARE ZERO TAD (1000 /SET GO BIT SDLC /THIS STARTS THE TAPE, SETS THE /UTS DELAY AND CLEARS AC & FLAGS
TAD DTFUN RTL AND C70 TAD C6201 /FIELD WHERE XFER MUST GO TO/FROM DCA DTFLD TAD DTFUN CMA RTR RTR AND C37 TAD (-37 /- # OF BLOCKS (PAGES) DCA DTNUM AC0001 /GO WAIT SOME TIME DTSTRT, DCA DTSTALL JMS MONITOR STALL DTSTALL, 1 /# OF TICKS. (1 TICK = 100 MS) / JMP DTUTS DTPREC, JMS MONITOR PRECEDE /WAIT SOME 20 MS DTUTS, SDSQ /SEE IF UTS-DELAY IS OVER JMP DTCNPR /THIS MUST BE THE UTS DELAY DTBLM, TAD C7000 /YES, AT LEAST 4 LINES PASSED DCA DTPRCN /AC =2 AFTER STALL, NO PROBLEM JMP I CDTCLR /OK NOW, GO FIND BLOCK # /HERE IMMEDIATELY AFTER A TRANSFER OF A BLOCK. DTRWCO, ION ///JUST BEFORE SDST !! SDST // ///TIME ERROR ? SZA /OR CHECKSUM ERROR ? JMP DTERR /YES, WHAT A PITY AFTER ALL ! /WE DON'T NEED TO CLEAR THE WRITE-BIT, BECAUSE THE /TIME ERROR, WHICH WILL SOON EXIST, WILL DO THAT. CLA CLL // /CLEAR LINK IN CASE WE'RE READY ISZ DTNUM /READY NOW ? SKP CLA /NO JMP DTSTOP // /YES CDTOIF /NO NEED TO DO THIS EARLIER. ACM1 TAD I CDTBLK DCA I CDTBLK /SET TO MINUS NEXT BLOCK# TAD C200 TAD DTADR /SET ADDRESS FOR NEXT TRANSFER DCA DTADR JMP DTBLM /SEE IF BLOCK # IS STILL OK
DTFND, TAD DTNUM /NOW THAT WE FOUND THE BLOCK, SNA CLA /DOES HE REALLY WANT A(NOTHER) /TRANSFER ? JMP DTSTOP /NO, STOP THE TAPE AND EXIT. / (LINK IS SUPPOSED TO BE ZERO) TAD (-12 /YES, SET LINECOUNT DCA DTCNT1 /MAX # OF LINES FROM NOW TO MT 42 ACM1 TAD DTADR DCA DTXADR /USE AUTOINDEX FOR FAST TRANSFER TAD DTFUN AND (1000 /READ OR WRITE ? DTFLD, HLT //OVERLAYED BY CDF FIELD OF XFER JMP I CDTXFR //TRANSFER NEXT BLOCK DTCNPR, ISZ DTPRCN /NOT ALWAYS PRECEDE JMP DTPREC /TRY ONCE MORE /TOO LONG DTERR, ION // ///ERROR RETURN, MAYBE IOF CLA STL ///LINK = 1: ERROR CDTOIF / ISZ DTRYCN /TRY 3 TIMES JMP DTRTRY /TRY ONE MORE TIME DTFATR, STL /FATAL ERROR RETURN DTSTOP, ION ///IF INTERRUPT ENABLE WAS OFF SDRC // ///WE STILL HAVE TO STOP THE TAPE AND DT6001 /READ UNIT # & DIRECTION SDLC /CLEAR S/G- (& R/W-) BIT CLA RAR // /LINK TO AC JMS MONITOR HALT SIGNAL CLEAR RELEASE DTSLOT, 0 DTPRCN, 7000 DTRYCN, 0 DTADR1, 0 DTBLK1, 0 PAGE
CDTSTRT,DTSTRT CDTPREC,DTPREC CDTSLWT,DTSLWT CDTFND, DTFND CDTERR, DTERR DTBLK, 0 DTCLR, SDRC /CLEAR SL- & QL-FLAGS AND C7000 IOF SDLC ///CLEAR TIME ERROR FLAG JMS I CDTSLWT ///READ COMMAND REGISTER SYNCHRONE ION AND (100 ///TIME- OR SELECT-ERROR ? SZA CLA JMP I CDTERR /YES, MUST BE SELECT ERROR. DTNXT, IOF ///WE CAN'T USE INTERRUPTS NOW SDRD ///CLEAR FLAGS AFTER IOF CLA ///SHOULD BE ACM3 TAD M4 DCA DTCNT JMS I CDTSLWT ///AND WAIT FOR NEXT FLAG SDRD ///READ DATA SPA CLA JMP DTSLOW ///IF NEG., WE CAN'T BE NEAR BLOCK# SDRC ///READ COMMAND AND (2077 ///MARK TRACK CLL RTL ///DIRECTION TO LINK TAD (-130 ///THE BLOCK # ! SNA JMP DTHOT ///YES, NOW HURRY ! TAD C4 ///MAYBE 25 ? SNA JMP DT25 ///COULD BE NEAR TAD (-130 ///TRY 53 SNA JMP DTNEAR ///YES, VERY NEAR NOW! TAD C4 ///OR MAYBE 52 SNA JMP DT52 ///NO, SERVE SOME INTERRUPTS ION ///NO HURRY IF NOT TAD (140 ///OR 22 (ENDZONE) ? SZA CLA /IF NOT, WE DON'T WANT TO KNOW JMP DTNXT /SLOW /NONE OF THEM ALL /YES, ASSUME ENDZONE BACKWARD DTFORT, ION DCA DTDIFB /CLEAR DIFFERENCE SDRC /READ COMMAND CLL RTL /DIRECTION TO LINK SZL /FORWARD OR REVERSE ? JMP DTMOVE /REVERSE, CHANGE DIRECTION DTSLOW, ION ///ION HAS A DELAY JMP DTNXT
DT25, JMS I CDTSLWT ///WAIT FOR NEXT LINE AND C77 TAD (-53 ///IS IT 53 ? SNA JMP DTNEAR ///YES, ONLY A FEW MICROSEC. NOW IAC ///ELSE IT MUST BE 52 SZA JMP I CDTERR SDRD SPA CLA ///SHOULD BE POS. JMP DTFORT ///ENDZONE DT52, JMS I CDTSLWT ///READ NEXT LINE AND C77 TAD (-25 SZA JMP I CDTERR SDRD SPA CLA ///SHOULD BE POSITIVE JMP DTFORT ///NO, THEN MUST BE ENDZONE ISZ DTCNT ///TIME-OUT JMP DT25 ///TRY NEXT ONE JMP DTSLOW DTNEAR, JMS I CDTSLWT ///WAIT FOR NEXT LINE AND (2077 CLL RTL ///DIRECTION TO LINK TAD (-130 ///MARK TRACK MUST BE 26 ! SZA JMP I CDTERR /// NO 26 ??? /DON'T CHANGE THE NEXT 20 LINES, THEY TOOK ME A LOT OF TIME DTHOT, ION ///AFTER NEXT INSTRUCTION NO HURRY SDRD ///READ BLOCK # WHERE WE ARE SPA /IF MINUS CODE IS NOT RIGHT JMP I CDTERR SNL TAD C3 /IF IN REVERSE LOOK FOR 3 BLOCKS IAC /BEFORE THE ACTUAL TARGET BLOCK. TAD DTBLK /ADD MINUS BLOCK # WE ARE LOOKING SZA /RIGHT BLOCK # ? JMP DTNOTY /NO, GET IT SNL /RIGHT DIRECTION ? JMP I CDTFND /OK, GO TRANSFER THIS PAGE DTNOTY, SPA SNA /MAKE POSITIVE CIA /IF AC = 0, LINK WILL CHANGE TO 0 SZL /IF LINK IS 0 NOW, CHANGE DIRECTION JMP DTNORT /NO, JUST COMPUTE HOW LONG TO WAIT DTRTRN, DCA DTDIFB /SAVE DIFFERENCE SDRC RTL /DIRECTION TO LINK
DTMOVE, CML RTR /DIRECTION HAS CHANGED NOW SDLC /GIVE COMMAND, CLEAR AC TAD (15 /CHANGE DIRECTION: 200 MS. TAD DTDIFB DTNORT, CLL RAR /COMPUTE # OF TICKS TO WAIT CLL RAR /WE SHOULD DEVIDE # OF BLOCKS BY 5, CLL RAR /BUT WE MULTIPLY BY .14 (OCTAL) /THAT IS, FORWARD:, BUT BACKWARD WE FAIL, BECAUSE OF THE /TIMING DURING FORMATTING. SO WE TRY .12 SNA /CAN WE DO A STALL ? JMP I CDTPREC /NO, MAYBE NEXT BLOCK DCA DTDIFB /# OF BLOCKS * .1 TAD DTDIFB CLL RAR CLL RAR / # *.02 TAD DTDIFB / + # *.1 JMP I CDTSTRT / = # *.12 PAGE
CDTRWCO,DTRWCO CDTRTRN,DTRTRN CDTER1, DTERR 0 DTCHCK, ISZ DTCNT1 // ///NOT 42, ENOUGH COUNTS ? JMP DT42 ///NO, TRY NEXT LINE ION /// JMP I CDTRTRN ///RETURN TAPE AND RETRY DTXFR, SZA CLA // /READ OR WRITE ? ACM1 DCA DTRWFL /0 IF READ, -1 IF WRITE TAD M200 // DCA DTCNT2 /SET COUNT TO - # WORDS IN BLOCK TAD (-DTQDNM DCA DTCNT // /SET COUNTER FOR TIME-OUT IOF ///NO TRICKS FOR ABOUT 20 MS !! SDRC ///CLEAR SINGLE & QUAD-LINE FLAG AND C7000 ///CLEAR WRITE-BIT SDLC // ///CLEAR TIME-ERROR FLAG DT42, JMS DTSLWT ///WAIT FOR NEXT LINE AND C77 ///MARK TRACK TAD (-42 // ///IS IT 42 ? SZA CLA JMP DTCHCK ///NO, TRY ENOUGH TIMES ISZ DTRWFL // ///0 OR -1 JMP DTREAD ///0 MEANS READ, -1 MEANS WRITE SDRC ///BIT 1: REVERSE DIRECTION AND (2700 ///BIT 3: WRITE; BIT 4: WRITE LOCK SZA // ///BIT 5: SELECT- OR TIME-ERROR JMP I CDTER1 ///ERROR SDRC ///READ UNIT #, DIR. & GO-BITS TAD (400 ///SET WRITE SDLC // ACM1 ///WRITE -1 TO REVERSE CHECKSUM JMS DTWRQD ///WRITE ACM1 // DCA DTCSUM ///PUT ALSO IN CHECKSUM DTWRBL, TAD I DTXADR ///READ FROM CORE JMS DTWRQD // ISZ DTCNT2 ///READY ? JMP DTWRBL ///NO, NEXT JMS DTWRQD // ///WRITE 0 IN 129TH (201TH) WORD JMS DTGCHK ///COMPUTE CHECKSUM JMS DTWRQD ///WRITE IT JMS DTWRQD // ///LET CHECKSUM FINISH JMP I CDTRWCO /// DTWRQD, 0 // ///SUBROUTINE TO WRITE ON TAPE JMS DTEFUN ///WITHIN A REASONABLE TIME DTWRLP, ISZ DTCNT ///TIME-OUT, (MUST BE INIT. SET) SKP // JMP I CDTER1 ///TOO LONG SDSQ ///FLAG UP ? JMP DTWRLP // ///NO, LOOP
DTWRFD, SDLD ///YES, WRITE NEXT WORD CLA TAD (-DTQDNM // ///SET COUNT FOR NEXT TRANSFER DCA DTCNT JMP I DTWRQD DTREAD, JMS DTRDQD JMS DTRDQD ///WAIT FOR 8 LINES TO PASS AND C77 // ///REVERSE CHECKSUM TAD (7700 DCA DTCSUM DTRDBL, JMS DTRDQD // ///WAIT FOR FOUR LINES & READ DATA JMS DTEFUN ///PREPARE CHECKSUM DCA I DTXADR ///PUT IN CORE ISZ DTCNT2 // ///COUNT THE NUMBER OF TRANSFERS JMP DTRDBL ///NEXT JMS DTRDQD ///READ 129TH (201TH) WORD JMS DTEFUN // JMS DTRDQD ///READ CHECKSUM AND (7700 /// JMS DTEFUN // CLA JMS DTGCHK //COMPARE CHECKSUMS JMP I CDTRWCO ///GO LOOK IF TRANSFER IS OK. DTRDQD, 0 // ///SUBROUTINE TO REPLACE THE ///NORMAL SEQUENCE: SDSQ;JMP .-1 ///BECAUSE IF SOMEONE STOPS THE CLA // ///TAPE, IT WILL NEVER SKIP. TAD (-DTQDNM ///TIME-OUT DTRDLP, IAC ///LOOP SMA // JMP I CDTER1 ///TOO LONG SDSQ JMP DTRDLP // ///FLAG STILL DOWN DTRDFD, SDRD ///UP, RETURN WITH DATA IN AC JMP I DTRDQD DTSLWT, 0 ///SUBR. TO REPLACE SDSS;JMP .-1 SDSS // ///BECAUSE THAT COULD BE TOO TIME- SKP CLA ///CONSUMING. FIRST TRY IF ALR. UP JMP DTSLFD ///YES, QUICK RETURN TAD (-100 // ///TIME-OUT, MUST BE ENOUGH DTSLLP, IAC SMA JMP I CDTER1 // ///TOO LONG SDSS JMP DTSLLP ///NOT YET UP, LOOP UNTIL... DTSLFD, SDRC // ///RETURN WITH COMMAND REGISTER JMP I DTSLWT
DTEFUN, 0 // ///I DIDN'T THINK IT'S POSSIBLE TO CMA ///WRITE THESE ROUTINES BETTER THAN DCA DTETMP ///THE BEST DIGITAL-PEOPLE DID. TAD DTETMP // ///SO I DIDN'T TRY TO, AND HEREBY AND DTCSUM ///I THANK THEM FOR DOING THE GOOD CIA ///THINKING WORK. CLL RAL // TAD DTETMP TAD DTCSUM DCA DTCSUM // TAD DTETMP CMA JMP I DTEFUN // DTGCHK, 0 // TAD DTCSUM IFZERO PDPTYP-PDP8E <CMA BSW ///FASTER ON A 8E ! > IFNZRO PDPTYP-PDP8E <CMA RTL;RTL;RTL > JMS DTEFUN CLA // TAD DTCSUM AND (7700 JMP I DTGCHK // $



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search