TITLE MTASRX - MAGTAPE ROUTINES FOR PDP-10(TM-10) V420 SUBTTL T. WACHS/TH TS 20 MAY 69 XP VMTASR,420 ;DEFINE VERSION NUMBER FOR LOADER STORAGE MAP ENTRY MTASRX MTASRX: INTERNAL MTADSP ;DISPATCH TABLE JRST MTAINI JRST HUNGTP ;HUNG DEVICE MTADSP: JRST MTAREL ;RELEASE JRST MTCLOS ;CLOSE JRST MTOUT JRST MTIN JRST SAVCHK ;ENTER JRST SAVCHK ;LOOKUP JRST MTDMPO JRST MTDMPI POPJ PDP, ;USETO POPJ PDP, ;USETI JRST CPOPJ1 ;RENAME POPJ PDP, ;CLOSE INPUT POPJ PDP, ;UTPCLR JRST MTAP0 MTC=340 MTS=344 ;MTACHN=FLAG CHANNEL ;MTOCHN=DATA CHANNEL ;MTFLAG=10*MTACHN + 400 ;MTBOTH=10*MTACHN+MTDCHN ;MTALOC=40 + 2*MTDCHN ;MTLOC1=MTALOC+1 INTERN MTAINT,MTADDS,MTADDB EXTERN ADVBFE,ADVBFF,MTFLAG,MTBOTH,SETACT,CLRACT,WSYNC EXTERN STDENS,SETIOD,MTREQ,MTAVAL,CLOCK,MTALOC,MTLOC1,OUT EXTERN CPOPJ,CPOPJ1,PIOMOD,PUNIT,MTWAIT,JIFSC2,COMCHK EXTERN PIOFF,PION,MTASAV,ADRERR,PDVCNT,MTSIZ,STOIOS,IADRCK COMPAT=1000 ;IBM COMPATABLE 9-TRACK DMPMOD=20000 ;DUMP MODE FLAG MTREW=40000 ;MAGTAPE IS REWINDING MTTRY=3 ;NO. OF TIMES TO RETRY ON AN ERROR QUANT=3 ;NO. OF RECORDS TO READ UNINTERRUPTED TP=DAT ;DDB MTADDB: SIXBIT /MTA0/ XWD ^D30*HUNGST,MTSIZ+1 0 MTADSP XWD 1023,154403 0 0 XWD PROG,0 XWD PROG,0 XP MTADDS,.-MTADDB ;SIZE OF DDB (FOR BUILD) ;INITIALIZE MTAINI: SETOM NMTREW ;RESET FLAGS SETOM UNIT SETZM ERRFLG SETZM REMNDR CONO MTC,0 ;TURN OFF MTC MOVE TAC,[JSR MTDEND] ;SET UP END-CONDITION MOVEM TAC,MTLOC1 ;FOR BLKI/BLKO POPJ PDP, ;IF ENTER OR LOOKUP IN SAVE MODE - CHANGE TO MODE 16 SAVCHK: LDB TAC,PIOMOD ;GET MODE CAIN TAC,0 ;SAVE MODE? TRO IOS,16 ;YES, CHANGE TO DUMP-MODE MOVEM IOS,DEVIOS(DEVDAT) JRST CPOPJ1 ;GIVE GOOD RETURN FROM LOOKUP/ENTER ;CLOSE MTCLOS: TLNN DEVDAT,OUTPB ;OUTPUT BEEN DONE? POPJ PDP, ;NO. GO AWAY LDB TAC,PIOMOD CAIGE TAC,16 ;DUMP MODE? PUSHJ PDP,OUT ;NO. EMPTY LAST PARTIAL BUFFER PUSHJ PDP,WSYNC ;WAIT FOR IO TO STOP MOVEI UUO,3 ;WRITE 2 ENDS-OF FILE PUSHJ PDP,MTAP1 TRNE IOS,IOIMPM ;WRITE LOCK? POPJ PDP, ;YES RETURN PUSHJ PDP,SETACT PUSHJ PDP,WSYNC MOVEI UUO,3 PUSHJ PDP,MTAP1 PUSHJ PDP,SETACT PUSHJ PDP,WSYNC MOVEI UUO,7 ;AND BACKSPACE OVER ONE OF THEM JRST MTAP1 HUNGTP: TLZN IOS,MTREW ;TAPE REWINDING? JRST THRUTP ;NO. GIVE UP CONTROL SOS NMTREW ;YES. DECREASE COUNT OF TAPES IN REW AOS MTREQ ;THRUTP WILL SOS THIS BACK JRST THRUTP ;TURN OFF TM10 ;CONNECT CONTROL TO A TRANSPORT CONECT: MOVEI TAC,440102 ;SET UP INTERRUPT CONDITIONS HRRM TAC,MTAINT HRRM DEVDAT,USEWRD ;SAVE DEVDAT FOR INTERRUPT LDB TP,PUNIT ;GET UNIT CAMN TP,UNIT ;ALREADY CONNECTED TO IT? JRST ONECT3 ;YES LSH TP,17 ;NO. SET FOR CONO CONSZ MTS,2 ;CONTROL FREE? JRST ONECT2 ;YES. DO A NO-OP CONO TRO TP,MTFLAG ;NO. SET CONTROL FREE ENABLE TLNN IOS,MTREW ;CONNECTING TO A REWINDING TAPE? PUSHJ PDP,ONECT4 ;NO.CHANGE RETURN ONECT2: HRLM TP,USEWRD ;MIGHT NEED ON INTERRUPT LEVEL CONO MTC,(TP) ;CONO TO MTC LSH TP,3 ;SAVE UNIT HLRZM TP,UNIT ONECT3: JUMPGE IOS,WSYNC ;WAIT FOR DEV TO FREE IF NOT REWINDING TRNN TP,4000 ;REWINDING, CONTROL FREE ENABLE? AOS (PDP) ;NO. SKIP RETURN POPJ PDP, ;YES. IMMEDIATE RETURN ONECT4: MOVEI TAC,TPREDY ;SET DEVICE ACTIVE HRRM TAC,-1(PDP) ;AGAIN WHEN INACTIVE JRST SETACT ;SET DEVICE ACTIVE ;DELAY TILL TAPE COMES OUT OF IO WAIT, THEN GET CONTROL DLYRDY: SETOM MTAVAL PUSHJ PDP,WSYNC ;WAIT FOR IO TO STOP ;GET MTC, CONNECT TAPE TO CONTROL TPREDY: AOSE MTREQ ;GET CONTROL PUSHJ PDP,MTWAIT ;WAIT FOR IT MOVEI TAC,QUANT ;SET QUANTUM TIME MOVEM TAC,QUANTM TPRDY2: MOVEM PROG,USEPRG PUSHJ PDP,CONECT ;CONECT CONTROL TO TAPE ;SET TP FOR THIS TAPE TPSET: LDB TP,[POINT 2,IOS,28] ;PARITY SKIPN TP ;USE STANDARD IF 0 MOVEI TP,STDENS ;NOT SPECIFIED, USE STANDARD FOR SYS. SOS TP ;SET TO USER'S REQUEST LSH TP,6 TRNN IOS,IOPAR ;PARITY TRO TP,40000 ;ODD MOVE TAC1,UNIT ;UNIT DPB TAC1,[POINT 3,TP,20] ;INTO COMMAND TRO TP,MTBOTH ;PI CHANNELS MOVEI TAC,MTTRY ;SET ERROR COUNT MOVNM TAC,ERCNT CONSZ MTS,4 ;7 OR 9 TRACK? JRST RDYCHK ;7 TRACK TLNN IOS,COMPAT ;9 TRACK. CORE DUMP? TROA TP,20030 ;YES TRO TP,40300 ;NO. SET 800 BPI, ODD PARITY ;MAKE SURE TAPE IS READY RDYCHK: CONSZ MTS,40 ;READY? POPJ PDP, ;YES CONSO MTS,20000 ;REWINDING? POPJ PDP, ;NO. LET XPORT HUNG INTERRUPT HANDLE IT TLO IOS,MTREW ;YES. MUST BE REWINDING PUSHJ PDP,SETACT ;DEVICE ACTIVE AOS NMTREW ;BUMP COUNT OF REWINDING DRIVES SOSL MTREQ ;LET SOMEONE ELSE USE TAPES JRST DLYRDY ;NOONE ELSE WANTS CONTROL PUSHJ PDP,CLOKRQ ;PUT IN A TIME REQUEST JRST DLYRDY+1 ;AND WAIT MTCLOK: XWD .+1,JIFSC2 SETZM CLKREQ ;INDICATE NO CLOCK REQUEST IN NOW SKIPL MTREQ ;CONTROL FREF? POPJ PDP, ;NO. COME BACK LATER MTCLK2: SETOM NMTREW ;COUNT NO. OF TAPES REWINDING MOVEM DEVDAT,SAVDEV MOVEI DEVDAT,MTADDB ;START AT MTA0 AOS MTREQ ;MAKE SURE NO OTHER MTA REQUESTS ARE HONORED NOW REWCHK: MOVE IOS,DEVIOS(DEVDAT) JUMPGE IOS,REWCK2 ;TAPE NOT REWINDING PUSHJ PDP,CONECT ;REWINDING - CONECT TO IT POPJ PDP, ;CONTROL NOT FREE NOW - RETURN ON INTERRUPT LEVEL REWCKA: CONSO MTS,40 ;STILL REWINDING? JRST REWCK1 ;YES TLZE IOS,IOW ;NO, TAKE OUT OF IO WAIT PUSHJ PDP,SETIOD TLZ IOS,MTREQ PUSHJ PDP,CLRACT ;NO LONGER ACTIVE JRST REWCK2 REWCK1: AOS NMTREW ;COUNT REWINDING TAPE MOVEI TAC,36 CONSZ MTS,20000 ;IF TAPE IS STILL REWINDING DPB TAC,PDVCNT ;MAKE SURE IT DOESN'T GET A HUNG DEVICE REWCK2: HLRZ DEVDAT,DEVSER(DEVDAT) ;NEXT DEVICE HLRZ TAC,DEVNAM(DEVDAT) ;A MAG TAPE? CAIN TAC,(SIXBIT .MTA.) JRST REWCHK ;YES. CHECK IT MOVE DEVDAT,SAVDEV ;PICK UP DEVDAT AGAIN SOSL MTREQ ;FREE MTASER AGAIN SETOM MTAVAL ;SOMEONE WAITING FOR CONTROL SKIPGE NMTREW ;ANY TAPE REWINDING? JRST THRUT3 ;NO CLOKRQ: MOVE TAC,MTCLOK ;PUT A CLOCK REQUEST IN CONO PI,PIOFF ;HAVE MONITOR WAKE UP SKIPL CLKREQ ;IF NO CLOCK REQUEST IN ASK TO WAKE UP IDPB TAC,CLOCK ;IN HALF A SECOND SETOM CLKREQ ;NOW WE HAVE ONE CONO PI,PION JRST THRUT3 SAVDEV: 0 ;TEMPORARY STORAGE FOR DEVDAT ;MTAPE MTAP0: TRNE UUO,100 ;SETTING 7 TRACK MODE? JRST SET9TK ;YES MTAP: TRZ IOS,776000 ;TURN OFF ERROR BITS MOVEM IOS,DEVIOS(DEVDAT) ;SAVE IOS MTAP1: PUSHJ PDP,TPREDY ;GET CONTROL FOR THIS TAPE MTAP3: TRZ TP,7 ;NO DATA TRANSFER ANDI UUO,17 ;GET FUNCTION ROT UUO,-1 ;TRANSLATE FROM TABLE SKIPL UUO SKIPA TAC,MTPTBL(UUO) HLRZ TAC,MTPTBL(UUO) TRZE TAC,100 ;MOVE TAPE BACKWORD? CONSO MTS,100000 ;YES, TAPE AT LOAD POINT? TRNN TAC,-1 ;OR NO-OP? JRST THRUTA ;YES, GO CHECK FOR BOT TRZE TAC,200 ;SKIP TO LOGICAL EOT? JRST LEOT ;YES TRZN TAC,400 ;TRY TO WRITE TAPE? JRST MTAGO ;NO. CONSZ MTS,10 ;YES. WRITE LOCKED? JRST ILLOP ;YES. LIGHT ERROR BIT MTAGO: DPB TAC,[POINT 4,TP,26] ;PUT FUNCTION INTO COMMAND HRLM TP,USEWRD ;SAVE COMMAND CONO MTC,(TP) ;START TAPE MOVING JRST CLRACT ;AND RETURN ;SET 9-TRACK TAPE SET9TK: TRNE UUO,1 TLOA IOS,COMPAT ;SET IBM COMPAT. MTAREL: TLZ IOS,COMPAT ;NOT IBM COMPAT JRST STOIOS ;SKIP TO LOGICAL EOT LEOT: CONSZ MTS,100000 ;TAPE AT BOT? JRST LEOT2 ;YES, DONT BACKSPACE PUSHJ PDP,MTAGO ;BACKSPACE RECORD PUSHJ PDP,EOTWT ;WAIT FOR IT LEOT2: MOVEI UUO,16 ;SKIP A FILE PUSHJ PDP,MTAP2 MOVEI UUO,6 ;SKIP A RECORD PUSHJ PDP,MTAP PUSHJ PDP,EOTWT ;WAIT FOR IT MOVE IOS,DEVIOS(DEVDAT) TRNN IOS,IODEND ;END OF FILE SEEN? JRST LEOT2 ;NO. SKIP TO NEXT FILE MOVEI UUO,7 ;YES. BACKSPACE RECORD MTAP2: PUSHJ PDP,TPRDY2 JRST MTAP3 ;WAIT FOR TAPE TO FINISH. MTREQ WILL COUNT DOWN AT END OF OPERATION EOTWT: AOSE MTREQ PUSHJ PDP,MTWAIT ;WAIT TILL MTREQ IS COUNTED DOWN POPJ PDP, MTPTBL: XWD 101,0 ;REW,NOP XWD 405,0 ;WRITE EOF. XWD 0,0 XWD 107,6 ;BACKSPACE REC,SKIP REC XWD 111,207 ;REW,UNLOAD,LOG EOT XWD 415,0 ;WRITE BLANK TAPE, XWD 0,0 XWD 117,16 ;BACK FILE,SKIP FILE ;OUTPUT UUO MTOUT: PUSHJ PDP,TPREDY ;GET CONTROL SETUP TP CONSZ MTS,10 ;WRITE LOCK? JRST ILLOP ;YES, SET IOIMPM AND RETURN CONSZ MTS,4000 ;EOT? TROA IOS,IOTEND+IOBKTL ;YES. LIGHT BIT TLOA IOS,IO ;NO. INDICATE OUTPUT JRST ADVOUT ;DONE IF EOT MTOUT1: MOVEI TAC,@DEVOAD(DEVDAT) ;ADDRESS OF BUFFER MOVN TAC1,1(TAC) ;-WORD COUNT HRL TAC,TAC1 ;IN LH OF COMMAND AOJG TAC,ADVOUT ;SKIP IF 0 WORDS MTOUT2: TRO TP,4000 ;FUNCTION = WRITE MOVSI TAC1,(BLKO MTC,) ;SETUP BLKO MTDTGO: MOVEM TAC,PNTR ;SAVE BLKI/BLKO POINTER MOVEM TAC,SVPNTR HRRI TAC1,PNTR ;BLKI/BLKO PNTR MOVEM TAC1,MTALOC ;INTO INTERRUPT LOC HRLM TP,USEWRD ;SAVE COMMAND CONO MTC,(TP) ;START TAPE MOVING TRO IOS,IOACT ;SETACT CLEARS IOW JRST STOIOS ;STORE IOS AND RETURN ;INPUT UUO MTIN: PUSHJ PDP,TPREDY ;SETUP TP FOR THIS DRIVE TLZ IOS,IO ;INPUT MTIN1: SETCM TAC,@DEVIAD(DEVDAT) ;-LARGEST POSSIBLE WRD CNT HRRI TAC,@DEVIAD(DEVDAT) ;STARTING ADDRESS ADD TAC,[XWD 2,1] ;MAKE REAL IOWD MTIN2: TRO TP,2000 ;FUNCTION = READ MOVSI TAC1,(BLKI MTC,) ;SETUP BLKI JRST MTDTGO ;GO START TAPE MTAINT: CONSO MTS,440102 ;INTERRUPT FOR MAG TAPE? JRST . ;NO. GO AWAY CONSO MTC,400 ;HAS CONTROL FREE ENABLED? CONSZ MTS,440100 ;NO. CONTROL FREE ERRONEOUSLY ON? JRST +2 ;REAL MTA INTERRUPT JRST MTAINT+1 ;THIS INTERRUPT NOT REALLY FOR MTA JSR MTASAV ;YES. SAVE ACS HRRZ DEVDAT,USEWRD ;RESET DEVDAT MOVE IOS,DEVIOS(DEVDAT) ;AND IOS JUMPL IOS,REWCKA ;CNTRL FREE INTERRUPT ON A REW TAPE MOVE PROG,USEPRG SKIPE TAC,ERRFLG ;BACKSPACE FROM ERROR? JRST TRYAGN ;YES. REISSUE COMMAND CONSZ MTS,440000 ;ERROR? JRST ERROR ;YES. ILLEGAL OP OR HUNG DEVICE CONSZ MTC,7 ;DATA OPERATION? JRST DATEND ;YES LDB TP,[POINT 4,USEWRD,8] ;GET FUNCTION CAIN TP,6 ;SKIPPING A RECORD? CONSO MTS,10000 ;YES. SEEN AN EOF? SKIPA ;NO. TRO IOS,IODEND ;YES. TURN ON EOF BIT THRUTA: CONSZ MTS,300000 ;NO. BOT OR REWINDING? TROA IOS,IOBOT ;YES. SET BOT BIT FOR USER TO SEE TRZ IOS,IOBOT ;NO. TURN OFF BOT BIT THRUTP: CONSZ MTS,4000 ;NO. EOT? TRO IOS,IOTEND ;YES TLZE IOS,IOW ;JOB IN IO WAIT? PUSHJ PDP,SETIOD ;YES. TAKE IT OUT TLZ IOS,DMPMOD PUSHJ PDP,CLRACT ;CONTROL FREE INTERRUPT? ;YES. DONT COUNT DOWN MTREQ SOSGE MTREQ ;COUNT DOWN REQUEST COUNT JRST THRUT2 ;NOONE ELSE WAITING SKIPL NMTREW ;IF THERE ARE TAPES REWINDING SKIPE CLKREQ ;WHICH HAVEN'T BEEN CHECKED IN SKIPA ;MORE THAN 1/2 A SECOND JRST MTCLK2 ;GO CHECK THEM NOW SETOM MTAVAL ;SOMEONE ELSE WANTS IT JRST THRUT3 ;DISMISS INTERRUPT AND RETURN ;HERE CONTROL IS ALL DONE. CHECK ON REWINDING TAPES IF NEEDED THRUT2: SKIPL NMTREW ;ANY DRIVES REWINDING? JRST MTCLK2 ;YES. CHECK IF ANY THROUGH THRUT3: HLRZ TP,USEWRD ;GET UNIT TRZ TP,17777 ;MASK OUT FUNCTION CONO MTC,(TP) ;DISMISS INTERRUPT HLLZS MTAINT ;DONT LOOK AT ANY MORE INTERRUPTS POPJ PDP, ;AND EXIT ;HERE WHEN BLKI/BLKO COUNTS DOWN TO ZERO MTDEND: 0 CONO MTS,1 ;GIVE A FUNCTION STOP JEN @MTDEND ;AND EXIT DATEND: CONSZ MTS,20600 ;RECORD OK? JRST RETRY ;PARITY, DATA LATE OR BAD TAPE DATND2: TLNE IOS,DMPMOD ;DUMP MODE? JRST DMPEND ;YES TLNN IOS,IO ;READING? JRST INPTND ;YES, FINISH INPUT ADVOUT: PUSHJ PDP,ADVBFE ;WRITING, ADVANCE BUFFERS ;END OF TAPE? JRST THRUTP ;YES, DONT WRITE ANY MORE NXTREC: TLZE IOS,IOW ;IN IO WAIT? PUSHJ PDP,SETIOD ;RESTART JOB SOSG QUANTM ;COUNT DOWN PROTECT TIME SKIPG MTREQ ;ANYONE ELSE WANT CONTROL? CONSZ MTS,4000 ;NO. KEEP GOING UNLESS EOT JRST THRUTP ;YES, GIVE UP CONTROL MOVNI TAC,MTTRY ;RESET ERROR COUNT MOVEM TAC,ERCNT HLRZ TP,USEWRD ;PICK UP COMMAND TLNE IOS,IO ;AND DO NEXT RECORD JRST MTOUT1 HLRZ TAC,@DEVIAD(DEVDAT) ;PICK MAX. SIZE OF BUFFER ADDI TAC,@DEVIAD(DEVDAT) ;AND IN FIRST ADDRESS PUSHJ PDP,IADRCK ;CHECK IT'S O.K. JRST THRUTP ;NO - RELEASE CONTROL JRST MTIN1 ;O.K. DO NEXT INPUT. ;HERE WHEN THROUGH AN INPUT RECORD INPTND: CONSZ MTS,10000 ;EOF? JRST DATEOF ;YES MOVEI TAC,@DEVIAD(DEVDAT) ;START OF RECORD HRRZ TAC1,PNTR ;WHERE WE ARE NOW SUBI TAC1,1(TAC) ;LAST LOC-FIRST LOC HRRM TAC1,1(TAC) ;=WORD COUNT PUSHJ PDP,ADVBFF ;ADVANCE BUFFERS JRST THRUTP ;NONE FREE JRST NXTREC ;CONTINUE WITH NEXT RECORD ; HERE AT THE END OF A DUMP MODE RECORD DMPEND: HLRZ TP,USEWRD ;SET UP COMMAND AGAIN CONSO MTS,14000 ;EOF OR EOT? JRST DMPBLK ;NO,GET NEXT COMMAND CONSO MTS,4000 ;EOF? TRO IOS,IODEND ;YES,SET EOF BIT JRST THRUTP ;AND RETURN TO USER MTDMPO: TLOA IOS,IO ;DUMP OUTPUT MTDMPI: TLZ IOS,IO ;DUMP INPUT HRLI UUO,PROG PUSHJ PDP,COMCHK ;CHECK VALIDIT OF LIST JRST ADRERR ;NOT VALID PUSH PDP,IOS ;WSYNC WILL CLOBBER IOS PUSHJ PDP,TPREDY ;GET CONTROL, SETUP TP POP PDP,IOS TLNE IOS,IO ;CHECK WRITE LOCK CONSO MTS,4010 ;AND EOT IF WRITING JRST MTDMP2 CONSO MTS,4000 ;ERROR TROA IOS,IOIMPM ;WRITE LOCK TRO IOS,IOTEND+IOBKTL ;EOT JRST THRUTP ;GIVE UP TAPE AND RETURN MTDMP2: TLO IOS,DMPMOD ;INDICATE DUMP-MODE SOS UUO ;WILL COUNT IT UP LATER MOVEM UUO,LSTLOC ;SAVE LOC OF LIST DMPBLK: PUSHJ PDP,NXTCOM ;GET NEXT COMMAND ADDI TAC,(PROG) ;ADD RELOCATION FACTOR TLNE IOS,IO ;WRITING? JRST MTOUT2 ;YES. GO WRITE RECORD TRNN IOS,1 TRO TP,10000 ;OR - READ ACROSS RECORD BOUNDARIES JRST MTIN2 ;GO READ RECORD(S) NXTCOM: SKIPE TAC,REMNDR ;PARTIAL IOWD LEFT TO DO? JRST NXTCM3 ;YES, CONTINUE WITH IT AOSA TAC,LSTLOC ;GET NEXT COMMAND LOC HRRM TAC,LSTLOC MOVE TAC,@TAC ;PICK UP COMMAND JUMPL TAC,NXTCM2 ;REAL COMMAND JUMPG TAC,NXTCOM+1 ;GO-TO-WORD POP PDP,TAC ;0 - THROUGH JRST THRUTP EXTERN MMTSIZ ;-MTSIZ NXTCM2: TLNE IOS,IO ;WRITING? TRNE IOS,1 ;YES, MODE 16? POPJ PDP, ;NO. USE IOWD AS OBTAINED NXTCM3: HLRE TAC1,TAC ;YES. GET WORDCOUNT SETZM REMNDR CAML TAC1,MTSZ ;RECORD TOO LARGE? POPJ PDP, ;NO, GO WRITE ADD TAC,[XWD MTSIZ,MTSIZ] ;YES. MOVEM TAC,REMNDR ;IOWD TO USE FOR NEXT RECORD SUBI TAC,MTSIZ ;ADDRESS FOR THIS IOWD HRLI TAC,MMTSIZ ;WRITE -MTSIZE WORD RECORDS POPJ PDP, ;RETURN THE IOWD REMNDR: 0 MTSZ: XWD -1,MMTSIZ ;NEG. OF RECORD SIZE IN WORDS MTHUNG: PUSHJ PDP,THRUT3 ;TURN OFF ERROR PI BIT PUSHJ PDP,SETACT ;TURN ON IOACT MOVEI TAC,1 ;SET HUNG-TIME TO 1 MORE TICK DPB TAC,PDVCNT ;SET HUNG TIME POPJ PDP, ;AND EXIT ERROR: CONSZ MTS,400000 ;HUNG DEVICE? JRST MTHUNG ;YES ;ILLEGAL OP INTERRUPT TRNN IOS,IOACT ;DATA OPERATION? JRST ILLOP ;NO. LIGHT ERROR BIT, GIVE UP CONTROL TRO IOS,IOIMPM ;YES. LIGHT IOIMPM MOVEM IOS,DEVIOS(DEVDAT) ;SINCE DEVICE IS STILL ACTIVE JRST THRUT2 ;COUNT DOWN MTRWQ ON HUNG CALL ILLOP: TROA IOS,IOIMPM DATEOF: TLO IOS,IOEND ;EOF - LIGHT BIT JRST THRUTP ;AND GIVE UP CONTROL ;TRY AGAIN ON PARITY ERROR OR BAD TAPE RETRY: TRNN IOS,IONRCK ;WANT TO STOP ON ERROR? AOSL TAC,ERCNT ;OR TRIED ENOUGH? JRST PERMER ;YES. PERMANENT ERROR RETRY1: MOVEI TAC,2 ;SET RETRY SWITCH MOVEM TAC,ERRFLG RETRY2: HLRZ TP,USEWRD ;PICK UP COMMAND ANDI TP,760770 ;SET FOR BACKSPACE CONO MTC,7000(TP) ;BACKSPACE RECORD POPJ PDP, ;AND GO AWAY ;COME HERE AFTER BACKSPACE IS THROUGH TRYAGN: SOJLE TAC,TRYSKP ;GO IF NOT 2ND BACKSPACE CONSO MTS,100000 ;BOT? JRST RETRY2-1 ;NO. BACKSPACE AGAIN TRYNXT: ;READ RECORD AGAIN MOVE TAC,SVPNTR ;RESET POINTER MOVEM TAC,PNTR HRLZ TP,USEWRD ;GET COMMMAND CONO MTC,(TP) ;EXECUTE IT AGAIN SETZM ERRFLG POPJ PDP, ;AND GO AWAY ;HERE AFTER 2ND BACKSPACE OR SKIP AFTER ERROR TRYSKP: JUMPL TAC,TRYNXT ;AFTER FORWARD SKIP IF NEGATIVE HLRZ TP,USEWRD ;AFTER 2ND BACKSPACE - SKIPA RECORD ANDI TP,760770 CONO MTC,6000(TP) ;SKIP A RECORD SETOM ERRFLG ;INDICATE FORWARD SKIP POPJ PDP, ;AND GO AWAY PERMER: TLNE IOS,IO ;READING? TRNE IOS,IONRCK ;NO RECOVERY WANTED? JRST SETIOS ;REALLY PERMANENT CAILE TAC,100 ;TRIED TO REWRITE 100 TIMES JRST SETIOS ;YES. REALLY PERMANENT JUMPG TAC,RETRY2 ;TRY WRITING WITH 3 INCHES OF MOVSI TAC,10000 ;BLANK TAPE TO ERASE BAD SPOT ORM TAC,USEWRD ;SET COMMAND TO 14 (FROM 4) JRST RETRY1 ;AND TRY AGAIN SETIOS: CONSZ MTS,400 ;DATA MISSED OR BAD TAPE? TRO IOS,IODERR ;YES CONSZ MTS,20200 ;PARITY ERROR? TRO IOS,IODTER ;YES JRST DATND2 ;SAVE ERROR WORD AND GO AWAY NMTREW: 0 USEWRD: 0 USEPRG: 0 CLKREQ: 0 UNIT: 0 ERCNT: 0 ERRFLG: 0 QUANTM: 0 LSTLOC: 0 PNTR: 0 SVPNTR: 0 MTAEND: END