File: TE.TK of Tape: Sources/Multi8/m8-tk-etc-20-10-80
(Source file text)
/TE.TK 21-MAR-79 /DECTAPE EMULATOR FOR BG /NAME: TE ("T^100+"E&3777) /LENGTH:ONE PAGE /FUNCTION:THIS MODULE DOES THE DECTAPE TRANSFERS FOR / THE OS8 BACKGROUND. / THIS TASK STARTS WITH A / SEARCH-ONLY IN ORDER TO REACH THE DESIRED BLOCK. / IN THIS TIME THE CURRENT BG IS INACTIVE AND / EVEN SWAPPED BACK TO THE DISK. / WHEN THE RIGHT BLOCK COMES UP, THE BG IS REQUESTED / IN CORE AGAIN, AND THE TRANSFER COMPLETED / IN A SINGLE RUSH. IN THIS TIME THE BG CANNOT BE / SWAPPED. (EMULATE) /ERRORS:ERRORS ARE DEFERRED TO THE BACKGROUND BY TAKING THE / HANDLER ERROR-RETURN. /USE: TAD (BJOB /POINTER TO BG REGISTERS / JMS MONITOR / CALL / "T^100+"E&3777 / BUSY RETURN /AC UNCHANGED / NORMAL RETURN /AC=0 *200 DTUAC, "T^100+"E&3777 /TE 200 /ONE PAGE;NO CONNECTS DTIDTV, DTDTV /RELOCATED POINTER DTUSTAT,0 /PNTR TO STATUS REG. OF BG /NOTE THAT DF POINTS TO FIELD 1 MOST OF THE TIME TE, DCA DTUSTAT TAD DTUSTAT /SET UP SOME POINTERS TAD (UAC DCA DTUAC /FETCH THE POINTER TO DTV TAD DTUSTAT TAD (UDTV-1 DCA AUTO10 TAD I AUTO10 AND C7770 DCA DTFUN TAD I DTUAC IFDEF TC08 <AND C7 /GET UNIT NUMBER > IFDEF TD8E <AND (1 /GET UNIT NUMBER > TAD DTFUN DCA DTFUN TAD I AUTO10 DCA DTDTV+1 // TAD I AUTO10 DCA DTBLK IFNZRO BGMAX-1 < /FOR MULTI-USER SYSTEMS: /LOOK INTO THE TAPETABLE AND SEE HOW FAR WE HAVE TO GO. IF IT'S /MORE THAN 50 BLOCKS, MAKE THE BG INACTIVE AND START A SEARCH-ONLY /REQUEST UNTIL WE ARE QUITE NEARBY. IF IT'S ONLY A SHORT DISTANCE /DO THE TRANSFER RIGHT AWAY, KEEPING THE BG IN EMULATE STATUS. AC3777 AND DTBLK /REMOVE SPECIAL MODE BIT DCA ZTEM1 TAD DTFUN AND C7 /EXTRACT UNIT NUMBER TAD (TAPETB CDF 0 // JMS DEFER //GET CURRENT POSITION CDF 10 / CLL RAR /CONVERT TO OS/8 BLOCK # SNA /IF ZERO THIS IS UNKNOWN: JMP DTLONG /THE TAPE HAS BEEN OFFLINE. CIA TAD ZTEM1 /MAKE DISTANCE SPA CIA /ABSOLUTE VALUE OF DISTANCE TAD (-50 / DTLONG, SPA CLA JMP DTSHRT /LUCKY BOY, NO SWAPS TODAY /FIRST SEARCH FOR THE DESIRED BLOCK;LENGTH=0 /STOP THE TAPE 4 BLOCKS IN ADVANCE OF THE TARGET BLOCK, /IF THE BLOCK # IS LESS THAN 4:SEARCH FOR BLK 0. TAD ZTEM1 TAD M4 SPA CLA DCA DTDTV+2 TAD DTFUN AND C7 DCA DTDTV AC2000 /MAKE BG INACTIVE TAD I DTUSTAT / AND (-LONG-1 /CLEAR HIS LONG-BIT DCA I DTUSTAT JMS TEKICK / JMS DTDO DTSHRT, /NOW THE BLOCK IS NEAR-BY > TAD DTFUN AND C70 /GET VIRTUAL FIELD # TAD I DTUSTAT /BG ACTIVE AND (-INACTIVE-1 TAD (INCORE /REQUEST IN CORE;LOCK IT THERE DCA I DTUSTAT JMS TEKICK / TAD DTUSTAT /NOW FIND THE SLOT-TO-WAIT-IN-CORE TAD (USLOT JMS DEFER DCA .+3 JMS MONITOR /AND WAIT FOR BG IN CORE WAIT 0 DCA ZTEM1 /=REAL FIELD # TAD DTFUN AND (7707 TAD ZTEM1 /INSERT REAL FIELD # IN FUNCTION WORD DCA DTDTV /FOR THE REAL TRANSFER TAD DTBLK DCA DTDTV+2 /REAL BLOCK JMS DTDO JMP DTRET2 DTRET1, JMS TEKICK AC4000 DTRET2, DCA I DTUAC /CLEAR/SET AC FOR NORMAL/ERROR JMS MONITOR EXIT RELEASE /DO THE SEARCH OR TRANSFER. /WAIT A LITTLE WHILE IF THE DRIVER TASK IS BUSY. /THEN TRY AGAIN...AND AGAIN...AND AGIAN... /DTDO RETURNS WITH AC=0 AND DF=10 DTDO, .-. DTTRY, CDTOIF /DTV IS IN THIS FIELD TAD DTIDTV JMS MONITOR CALL "D^100+"T&3777/DT JMP DTSTALL //TRY AND TRY DCA DTSLOT //ACCEPTED;SAVE SLOT# JMS MONITOR //WAIT FOR COMPLETION WAIT DTSLOT, 0 CDF 10 SNA CLA JMP I DTDO /NO ERRORS JMP DTRET1 /BG ERROR ONLY DTSTALL,JMS MONITOR // STALL DGNTICK%5 /0.2 SECS CLA // JMP DTTRY // DTFUN, IFNZRO BGMAX-1 <0 /FUNCTION WORD > DTDTV, 0 0 IFNZRO BGMAX-1 <0 > DTBLK, 0 TEKICK, 0 JMS MONITOR SIGNAL BSSLOT JMP I TEKICK $$