/***** MULTI8 DECTAPE EMULATOR ********* /LAST EDIT: 14-JULY-75, JV /LAST EDIT: 4-JULY-75, ELC /LAST EDIT: 30-JUNE-75, ELC /LAST EDIT: 25-JUNE-75, JV+ELC /LAST EDIT: 1-JUNE-75, JV /LAST EDIT: 8-JANUARI-75, ELC /LAST EDIT: 12 OKTOBER 74, ELC /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 IS NOT DONE THROUGH / EMULATION OF EVERY DECTAPE INSTRUCTION, SINCE / THIS WOULD BE TOO SLOW AND TOO ELABORATE. / THE FOLLOWING SIMPLE SOLUTION IS TAKEN: / THERE IS A SPECIAL DECTAPE HANDLER FOR OS8 / WHICH REPLACES THE CONVENTIONAL ONE. THIS / HANDLER PICKS UP THE ARGUMENTS FOLLOWING THE / CALL AND COMPUTES THE DECTAPE UNIT NUMBER. / IT THEN ISSUES A GIANT IOT (6770) WHICH IS / RECOGNISED BY THE FOREGROUND. /CONCEPT:THE MODULE IS ENTERED VIA THE SPECIAL FUNCTIONS IOT. / IT THEN CALLS THE DECTAPE BLOCKDRIVER FOR A / SEARCH-ONLY IN ORDBLOCK. / IN THIS TIME TE AND / EVEN SWAPPED BATHE RIGHT BLOCK COMES UP 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 (BJERS / JMS MONITOR / 77 / BUSY RETURN /AC UN /AC=0:NO ERRORS / /HE BG ISSUES THE 'GIANT IOT' 6770 /FOLLOWED BY THE DATATRANSFER VECTOR: /TAD (DTAFUN /6770 /RLL.LLL.FFF.### /READ/WRITE;LENGTH(PAGES);FIELD;UNIT /BUFFER ADDRESS IN CORE /BLOCK# ON DECTAPE /HERE IS WHERE THE ERROR RETURN GOES TO /HERE GOES THE NORMAL RETURN TO *200 DTUAC, "T^100+"E&3777 /TE DTUPC, 200 /ONE PAGE;NO CONNECTS DTIDTV, DTDTV /RELOCATED POINTER DTUSTAT,0 /PNTR TO STATUS REG. OF BG /NOTE THAT DF POINTS TO MONFLD MOST OF THE TIME TE, DCA DTUSTAT TAD DTUSTAT /SET UP SOME POINTERS TAD C3 DCA DTUPC AC0002 TAD DTUPC DCA DTUAC /FETCH THE POINTER TO DTV TAD DTUSTAT TAD (UDTV-1 DCA AUTO10 TAD I AUTO10 AND C7770 DCA DTFUN TAD I DTUAC AND C7 /GET UNIT NUMBER TAD DTFUN DCA DTFUN TAD I AUTO10 DCA DTDTV+1 // TAD I AUTO10 DCA DTBLK IFNZRO BGMAX-1 < /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 NORT DISTANCE /DO THE TRNG THE BG IN EMULATE STATAPETABLE SHOULD BE UPDA/STARTADDRESS. TAD DTFUN AND C7 /EXTRACT UNIT NUMBER TAD (TAPETB JMS DEFER /GET CURRENT POSITION STL SNA /IF ZERO THIS IS UNKNOWN: JMP DTLONG /THE TAPE HAS BEEN OFFLINE. CIA TAD DTBLK /MAKE DISABSOLUTE VALUE OF DISTANAD GOES TO LINK DTLONG, X /X WAS USED BY DEFERLA 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 DTBLK TAD M4 SPA /L=0: SEARCH BACKWARD CLA DCA DTDTV+2 TAD DTFUN AND C77 DCA DTDTV TAD I DTUSTAT TAD (INACTIVE-EMULATE+NOBOOT /(NOBOOT IS FOR 'BO' /TO SHOW SOMETHING IS GOING ON DCA I DTUSTAT IFZERO BGMAX-2&4000 < JMS TEKICK / > JMS DTDO /NOW THE BLOCK IS NEAR-BY;CALL BG IN CORE TAD I DTUSTAT /BG ACTIVE TAD (EMULATE-INACTIVE+INCORE/REQUEST IN CORE;LOCK IT THERE DCA I DTUSTAT IFZERO BGMAX-2&4000 < 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 CLA STL /SEARCH FORWARD TAD DTDTV+2 SNA CLA /IF BLOCK LESS THAN 4, CML /SEARCH BACKWARD DTSHRT, TAD DTFUN DCA DTDTV /FOR THE REAL TRANSFER TAD DTBLK DCA DTDTV+2 /REA JMP .+3 DTRET1, IFZEREKICK / > AC4000 DCAOR NORMAL/ERROR JMS MO /DO THE SEARCH OR TRANSFER,GIVE A NUMBER OF /RE-TRIALS;AND WAIT A LITTLE WHILE IF THE MODULE IS BUSY. /THEN TRY AGAIN...AND AGAIN...AND AGIAN... /DTDO RETURNS WITH AC=0 AND DF=MONFLD DTDO, .-. DTTRY, CDTOIF /AD DTIDTV JMS MONITOR&3777/DT JMP DTSTALL OT //ACCEPTED;SAVE SLOT#R COMPLETION WAIT DTSLOT, 0 CDF MONFLD SNA CLA JMP I DTDO /NO ERRORS JMP DTRET1 /BG ERROR ONLY DTSTALL,JMS MONITOR // STALL DGNTICK%2 /0.5 SECS CLA // JMP DTTRY // DTFUN, IFNZRO BGMAX-1 <0 /FUNCTION WORD > DTDTV, 0 0 IFNZRO BGMAX-1 <0 > DTBLK, 0 IFZERO BGMAX-2&4000 < TEKICK, 0 JMS MONITOR SIGNAL BSSLOT CLA CLL JMP I TEKICK / > $$