TITLE DTASRN - NEW FORMAT DECTAPE SERVICE FOR TD-10 (PDP-10) SUBTTL T. WACHS/RCC TS 04 JUN 69 V406 XP VDTASX,406 ;DEFINE GLOBABL VERSION NUMBER FOR LOADER MAP. IFNDEF ALMACT, ENTRY DTASRN DTASRN: ;THIS ENTRY FOR SELECTIVE LOAD BYT BUILD INTERNAL DTADSP EXTERNAL TPOPJ,TPOPJ1,DTALOC,DTALC2,DTBOTH,WSYNC,DTACHL EXTERNAL STOIOS,STOTAC,SETACT,CLRACT,OUT,DTASAV,PIOMOD EXTERNAL DTAVAL,DTREQ,DTWAIT,SETIOD,THSDAT,PUNIT EXTERNAL ADVBFE,ADVBFF,ADRERR,WAIT1,CPOPJ,CPOPJ1,BADDIR EXTERNAL COMCHK,JOBPD1,DTTURN,PJOBN,RELEA9,UADCK1,STREQ EXTERNAL CLOCK,JBTADR,DEVPHY,PION,PIOFF,DTTRY ;DTALOC=PI LOC FOR DATA - CHANGED BY ROUTINE ;DTALC2=PI LOC+1 FOR DAT ;DTBOTH=10*(PI FOR DATA CHAN) + PI FOR FLAGS CHAN ;DTTURN=300200+DTBOTH (CONO FOR TURN-AROUND) BLK=4 DIRBLK=^D100 ;NUMBER OF BLOCK FOR DIRECTORY TOPBLK=1101 ;HIGHEST LEGAL BLOCK NUMBER NAMSTR=^D83 ;1ST NAME WORD IN DIRECTORY QUANT=3 ;NUMBER OF BLOCKS CAN READ BEORE GIVING UP DTC MINDIS=14 ;MINMUM NUMBER OF BLOCKS TO SEARCH BEFORE DISCONNECTING ;FROM A TAPE SPACE=4 ;NUMBER OF BLOCKS SEPERATING CONTIGUOUS BLKS OF A FILE ;DDB MAGIC CELLS FSTBLK=13 DLOC=14 IBLK=15 OBLK=16 DISPAD=17 DMPLST=20 SVDWRD=21 ;FLAGS IN RH OF IOS UDSD=100 LSTSAV=20000 ;FLAGS IN LH OF IOS NOLINK=200 CHNGDR=400 RVERSE=1000 SINGL=2000 ;JUST READ OR WRITE 1 BLOCK DMPMOD=4000 RWDIR=10000 DMPCLS=20000 NOBUF=40000 ;DATA GOING DIRECTLY INTO USER AREA NOBUFC=737777 ;-NOBUF REWBIT=100000 RUNBIT=200000 RECKON=400000 ;THIS TAPE IS DEAD-RECKONING. ; (MUST BE SIGN BIT) CPBIT=-1 ;FEATURE TEST TO ALLOW IO INTO USER AREA DIRECTLY ;IT WILL ONLY HAPPEN ON DUMP MODE WITH NON-STANDARD BIT ;(UDSD) ON EXTERN JIFSEC INTERN DTAINT,DTADDB,DTAINI,DTADDS,DTADSP DTADDB: SIXBIT /DTA0/ XWD ^D60*HUNGST,200 0 EXP DTADSP XWD 1107,154403 EXP 0,0 XWD PROG,0 XWD PROG,0 EXP 0,0,0 EXP DTADIR EXP 0,0,0,0,0 DTADIR: BLOCK 200 DTADDS=.-DTADDB JRST DTAINI JRST HUNGTP ;HUNG DEVICE DTADSP: JRST UREL JRST UCLS JRST UOUT JRST UIN JRST ENTR JRST LOOK JRST DMPO JRST DMPI JRST SETO JRST SETI JRST GETF JRST RENAM POPJ PDP, ;CLOSE INPUT JRST UTPCLR ;FALL INTO MTAPE HRRZ TAC1,UUO ;MTAPE - GET OPERATION CAIE TAC1,1 ;REWIND OR CAIN TAC1,11 ;REWIND UNLOAD ARE LEGAL SOJA TAC1,MTAP0 POPJ PDP, ;OTHERS ARE NO-OPS ;INITIALIZE DTC DTAINI: CONO DTC,0 SETZM DISCON MOVEI TAC,^D1000 ;COMPUTE NO OF MILLISECS/TICK IDIVI TAC,JIFSEC ;FOR THIS FREQUENCY CLOCK ADDI TAC,1 ;ADD FUDGE FACTORE FOR SAFETY HRRM TAC,MSECPT ;SAVE FOR CLOCK CALCULATION POPJ PDP, EXTERN JOBSAV ;LOOKUP A DIRECTORY ENTRY LOOK: TRNE IOS,UDSD ;NON-STANDARD? JRST CPOPJ1 ;YES. LOOKUP OK PUSHJ PDP,DSERCH ;NO. FIND DIRECTORY ENTRY POPJ PDP, ;NOT THERE HRRZ TAC1,26(TAC) ;GET DATE, NO. OF 1K BLOCKS NEEDED AOS UUO ;POINT UUO TO WORD 3 MOVEM TAC1,@UUO ;INTO USER'S LOOKUP BLOCK LOOKA: HLRE TAC,TAC ;GET INDEX ADDI TAC,27 SKIPN FSTBLK(DEVDAT) ;TAPE BEING WRITTEN? HRLM TAC,OBLK(DEVDAT) ;NO. SAVE INDEX FOR POSSIUBLE OUTPUT HRRM TAC,AC1 ;SAVE INDEX IN CASE LH(IBLK) IS ;CHANGED BY DEAD-RECKONING MOVEI TAC1,0 PUSHJ PDP,BLKSRC ;COUNT NUMBER OF BLOCKS IN FILE AOJA UUO,STOWD4 ;LAST BLOCK DONE AOS TAC1 ;COUNT THE BLOCK SOS 1(PDP) ;ADJUST FOR CORRECT RETURN AOBJN PDP,BLKSRB ;LOOK FOR NEXT BLOCK ;TAC1 HAS THE NUMBER OF BLOCKS BELONGING TO THE FILE STOWD4: IMUL TAC1,[-177] ;-NUMBER OF WORDS IF ALL BLOCKS FULL HRLZM TAC1,@UUO ;STORE IN DIRECOTRY WD 4 SUBI UUO,2 ;POINT UUO TO DIRECORY WD 2 TLZ IOS,IO ;MAKE SURE IO IS OFF TLO IOS,SINGL ;JUST READ 1 RECORD MOVEI BLK,DIRBLK ;NO, FIND FIRST MENTION OF BLOCK PUSHJ PDP,LSTFRE+1 ;NEAR DIRECTORY JUMPN BLK,LOOKE ;FOUND IF BLK NOT =0 LOOKD: PUSHJ PDP,BLKSRC ;FIND FIRST MENTION IN DIRECTORY JRST BDDIR ;NOT THERE - ERROR LOOKE: PUSHJ PDP,RDBLUK ;GO READ IT PUSHJ PDP,WAIT1 ;WAIT TILL IT'S IN HRLM AC1,IBLK(DEVDAT) ;SAVE INDEX ON INPUT FILE FOR LATER ;TEST ON ENTER - WONT ALLOW ENTER ;TO BE DONE ON LOOKED-UP FILE HRRZ BLK,IBLK(DEVDAT) ;GET FIRST BLOCK OF FILE LOOKC: SKIPN FSTBLK(DEVDAT) ;IF FILE HAS NOT BEEN ENTERED MOVEM BLK,FSTBLK(DEVDAT) ;SAVE IN DDB HRRM BLK,@UUO ;SAVE IN USER'S AREA HLL TAC,@UUO ;GET USER'S EXTENSION HLLM TAC,DEVEXT(DEVDAT) ;SAVE IN DEVCE DATA BLOCK FOR RENAME AND ; AND SUPERSEDING SHARED SEGMENTS JRST CPOPJ1 ;AND TAKE GOOD EXIT RENAM: PUSH PDP,UUO ;SAVE LOC OF NEW NAME MOVEI UUO,DEVFIL(DEVDAT) ;SEARCH FOR OLD NAME PUSHJ PDP,DSER1 JRST RENER1 ;NOT FOUND - ERROR POP PDP,UUO ;FOUND, RESTORE UUO SKIPE @UUO ;RENAMING TO ZERO? JRST RENAM2 ;NO. GO TO REAL RENAME SETZM (TAC) ;YES. DELETE NAME IN DIR SETZM 26(TAC) ;DELETE EXTENSION SETZM DEVFIL(DEVDAT) ;ZERO DEVFIL HLRE TAC,TAC ;GET INDEX OF FILE ADDI TAC,27 PUSHJ PDP,DLETE ;DELETE ALL BLOCKS OF FILE RENAM1: TLO IOS,CHNGDR ;DIRECTORY HAS CHANGED AOS (PDP) ;SET FOR GOOD RETURN JRST STOIOS ;GO TO USER ;COME HERE TO RENAME TO A REAL NEW NAME RENAM2: MOVE DAT,TAC ;SAVE LOC OF NAME IN DIRECTORY PUSHJ PDP,DSERCH ;SEARCH FOR NEW NAME SKIPA ;NOT FOUND - GOOD JRST RENER2 ;NAME ALREADY EXISTS - ERROR MOVE TAC,@UUO ;GET NEW NAME MOVEM TAC,(DAT) ;SAVE IN DIR AOS UUO MOVE TAC,@UUO ;EXTENSION HLLM TAC,26(DAT) ;SAVE IN DIR HLLM TAC,DEVEXT(DEVDAT) ;SAVE INN DDB JRST RENAM1 ;GIVE GOOD RETURN TO USER RENER1: POP PDP,UUO TDZA TAC,TAC ;RH E+1 =0 RENER2: MOVEI TAC,4 ;RH E+1 =4 AOS UUO ;POINT TO 2ND WORD HRRM TAC,@UUO ;SET ERRORR CODE POPJ PDP, ;AND TAKE ERROR RETURN ;SEARCH DIRECTORY FOR A MATCH DSERCH: MOVEI AC1,3(UUO) ;CHECK VALIDITY OF ADDRESS PUSHJ PDP,UADCK1 ;NEVER RETURN IF ADDR. OUT OF BOUNDS DSER1: PUSHJ PDP,DIRCHK ;ENSURE DIRECTORY IS IN CORE HRRZ TAC,DLOC(DEVDAT) ;LOCAION OF DIRECTORY ADD TAC,[XWD -26,NAMSTR] ;POINT TO START OF NAMES NMLOOK: SKIPN TAC1,@UUO ;GET NAME JRST TPOPJ ;NULL ARGUMENT - ERROR RETURN MOVEM TAC1,DEVFIL(DEVDAT) ;STORE FOR RENAME AND SUPERSEDING ; SHARED SEGMENTS CAMN TAC1,(TAC) ;TEST FOR MATCH AOJA UUO,NMFOUN ;FOUND NAME, CHECK EXTENSION AOBJN TAC,.-2 ;TRY NEXT NAME POPJ PDP, ;NOT FOUND NMFOUN: HLLZ TAC1,@UUO ;PICK UP USER'S EXTENSION XOR TAC1,26(TAC) ;TEST AGAINST DIRECTORY EXTENSION TLNN TAC1,-1 ;MATCH? JRST CPOPJ1 ;YES. RETURN AOBJP TAC,.+2 SOJA UUO,NMLOOK ;NO. TRY NEXT NAME SOJA UUO,CPOPJ ;NAME NOT FOUND ;CHECK IF DIRECTORY IS IN CORE, IF NOT, READ IT DIRCHK: TRNN IOS,UDSD ;DONT BOTHER IF NON-STANDARD SKIPG DEVMOD(DEVDAT) ;IS IT IN? POPJ PDP, ;YES. RETURN MOVEI BLK,DIRBLK ;BLOCK NUMBER TLZ IOS,IO PUSHJ PDP,GETDT ;GET CONTROL TLO IOS,RWDIR ;JUST READ 1 BLOCK PUSHJ PDP,READBC ;GO READ IT PUSHJ PDP,WAIT1 ;WAIT TILL IN MOVSI TAC1,DVDIRI ;SET DIRECTORY-IN-CORE BIT ORM TAC1,DEVMOD(DEVDAT) POPJ PDP, ;SEARCH DIRECTORY FOR FILE WHOSE INDEX IS IN TAC BLKSRC: MOVSI DAT,440500 ;DAT IS A BLOCK POINTER HRR DAT,DLOC(DEVDAT) MOVEI BLK,1 ;START AT BLOCK 1 BLKSRA: ILDB TEM,DAT ;INDEX OF NEXT BLOCK CAMN TAC,TEM ;MATCH? JRST CPOPJ1 ;YES. RETURN BLKSRB: CAIGE BLK,TOPBLK ;NO. SEARCHED LAST? AOJA BLK,BLKSRA ;NO. TRY NEXT BLOCK POPJ PDP, ;YES. RETURN ;SET UP POINTER TO DIRECTORY FOR BLOCK IN BLK SETPTR: PUSH PDP,BLK ;SAVE BLK PUSHJ PDP,DRPTR ;SET BLK AS A BYTE POINTER MOVE DAT,BLK ;RETURN IT IN DAT POP PDP,BLK ;RESTORE BLK POPJ PDP, ;AND RETURN ;GET NEXT AVAILABLE FREE BLOCK NXTFRE: PUSH PDP,TEM PUSHJ PDP,SETPTR ;SET DAT TO A BYTE POINTER MOVEI TAC,0 ;LOOK FOR FREE BLOCKS PUSHJ PDP,BLKSRA ;FIND A ZERO BLOCK MOVEI BLK,0 ;NOT THERE- RETURN 0 FREXIT: POP PDP,TEM POPJ PDP, ;GET PREVIOUS FREE BLOCK LSTFRE: MOVEI TAC,0 PUSH PDP,TEM ADDI BLK,2 PUSHJ PDP,SETPTR ;SET DAT AS A POINTER SUBI BLK,2 PUSHJ PDP,DECPTR ;DECREMENT BYTE POINTER LDB TEM,DAT ;INDEX TO BLOCK CAMN TEM,TAC ;FOUND? JRST FREXIT ;YES. RETURN SOJG BLK,.-4 ;TRY AGAIN IF NOT AT START JRST FREXIT ;REACHED START - RETURN BLK=0 ;DECREMENT BYTE POINTER DECPTR: JUMPL DAT,.+5 ADD DAT,[BYTE (6) 5] ;DECREMENT JUMPG DAT,CPOPJ ;IF POSITIVE - SAME WORD HRLI DAT,010500 ;RESET TO PREVIOS WORD SOJA DAT,CPOPJ HRLI DAT,060500 SOJA DAT,CPOPJ ;COME HERE TO DELETE THE FILE WHOSE INDEX IS INN TAC DLETE: MOVEI TAC1,0 ;SET TO DELETE BLOCKS PUSHJ PDP,BLKSRC ;FIND A BLOCK BELONGING TO FILE JRST CPOPJ ;ALL THROUGH DPB TAC1,DAT ;DELETE IT SOS 1(PDP) ;ADJUST PDL FOR RETURN AOBJN PDP,BLKSRB ;AND FIND NEXT MATCH ;ENTER A FILE NAME IN DIRECTORY ENTR: TRNE IOS,UDSD ;NON STANDARD? JRST CPOPJ1 ;YES. RETURN PUSHJ PDP,DSERCH ;NO. LOOK FOR MATCH JRST NEWENT ;THIS IS A NEW ENTRY ENTR2: MOVE TAC1,@UUO ;PICK UP 2ND WORD (EXTENSSION) AOS UUO ;POINT TO WORD 3 HRR TAC1,@UUO ;ADD DATE TRNN TAC1,7777 ;IS DATE ALREADY THERE? IOR TAC1,THSDAT ;NO, ADD CURRENT DATE MOVEM TAC1,26(TAC) ;INTO DIRECTORY SKIPGE AC3,OBLK(DEVDAT) ;IS THIS A SAVE FILE (UGETF DONE ;BEFORE THE ENTER?) AOJA UUO,SETWD4 ;YES. STORE LENGTH IN DIRECTORY ENTRA: SUBI UUO,2 ;NO. POINT TO NAME MOVE TAC1,@UUO ;PICK IT UP MOVEM TAC1,(TAC) ;INTO DIRECTORY HLRE TAC,TAC ;COMPUTE INDEX OF FILE ADDI TAC,27 HLRZ DAT,IBLK(DEVDAT) ;INDEX OF INPUT FILE SUB DAT,TAC ;WRITE SAME FILE AS READING? JUMPE DAT,CPOPJ ;TAKE ERROR RETURN IF YES HRLM TAC,OBLK(DEVDAT) ;SAVE INDEX IN DDB PUSHJ PDP,DLETE ;DELETE ALL BLOCKS BELONGING TO FILE AOJE AC3,ENTRD ;FIND FIRST FREE BLOCK ON TAPE IF THIS ;IS A SAVE FILE (UGETF DONE) MOVEI BLK,DIRBLK ;NO. GET 1ST BLOCK CLOSE TO TLO IOS,RVERSE ;DIRECTORY. GOING IN REVERSE PUSHJ PDP,USLSTA CAILE BLK,TOPBLK ;BLOCK LEGAL? POPJ PDP, ;NO. ERROR RETURN ENTRC: MOVEM BLK,FSTBLK(DEVDAT) ;SAVE AS 1ST BLOCK HRRM BLK,OBLK(DEVDAT) ;SAVE IN DDB AOS UUO ;POINT UUO TO WORD 2 HRRM BLK,@UUO ;SAVE 1ST BLOCK IN USER'S AREA HLL TAC,@UUO ;GET EXTENSION HLLM TAC,DEVEXT(DEVDAT) ;SAVE EXTENSION IN DDB ALSO TLO IOS,NOLINK AOS (PDP) ;MARK DIRECTORY ENTRY POINTED TO BY BLK AS TAKEN MARKDR: PUSHJ PDP,DRPTR ;SET POINTER TO BLOCK IN DIR HLRZ TAC,OBLK(DEVDAT) ;PICK UP INDEX IDPB TAC,BLK ;MARK DIRECTORY TLO IOS,CHNGDR ;DIRECTORY HAS CHANGED JRST STOIOS ;;SET POINTER TO CORRECT DIRECTORY ENTRY DRPTR: SUBI BLK,1 ;SET FOR ILDB OR IDPB IDIVI BLK,7 ;COMPUTE WORD, POSITION ADD BLK,DLOC(DEVDAT) ;GET CORRECT ADDRESS HRLI BLK,440500 ;MAKE IT A BYTE POINTER JUMPE DAT,CPOPJ ;CORRECT FOR POSITION IN WORD IBP BLK SOJG DAT,.-1 POPJ PDP, ;HERE FOR NEW FILE NAME ON ENTER NEWENT: SUB TAC,[XWD 26,26];START AT BEGINNING OF DIRECT. SKIPN (TAC) ;FIND A FREE SLOT AOJA UUO,ENTR2 ;RETURN WITH UUO POINTING TO WRD 2 AOBJN TAC,.-2 POPJ PDP, ;NONE AVAILABLE. ;SET UP LENGTH OF FILE IN DIRECTORY FOR A SAVE FILE SETWD4: HLRE TAC1,@UUO ;GET -LENGTH MOVNS TAC1 ;+LENGTH HRRE TEM,@UUO ADD TAC1,TEM ; +START ADDRESS TRZ TAC1,1777 ;STORE N-1, WHERE N IS NO OF K LSH TAC1,2 ORM TAC1,26(TAC) ;INTO 2ND WRD OF DIRECTORY SOJA UUO,ENTRA ;CONTINUE WITH ENTER ENTRD: MOVEI TAC,0 ;GET THE 1ST FREE BLOCK ON TAPE PUSHJ PDP,BLKSRC ;AS THE 1ST LOGICAL BLOCK OF THE FILE POPJ PDP, ;NONE AVAILABLE JRST ENTRC ;CONTINUE WITH ENTER ;USETI - SET NEXT INPUT BLOCK TO READ SETI: TDZ IOS,[XWD IOEND,IODEND] SKIPA DAT,DEVDAT ;USETO - SET NEXT OUTPUT BLOCK TO READ SETO: MOVEI DAT,1(DEVDAT) PUSHJ PDP,WAIT1 ;WAIT FOR BUFFERES TO FILL (OR EMPTY) HRRM UUO,IBLK(DAT) ;SET BLOCK NUMBER JRST STOIOS ;STOE IOS, POPJ ;UGETF - GET NEXT FREE BLOCK FOR THIS FILE GETF: PUSHJ PDP,WAIT1 ;WAIT TILL BUFFERES EMPTY PUSHJ PDP,DIRCHK ;ENSURE DIR, IN CORE PUSHJ PDP,USRFRE ;GET NEXT AVAILABLE BLOCK SKIPN OBLK(DEVDAT) ;HAS AN ENTER OR LOOKUP BEEN DONE? SETOB BLK,OBLK(DEVDAT) ;NO, SET SWITCH SO THAT THE NEXT ENTER ;WILL FINE FIRST FREE BLOCK ON TAPE MOVE TAC,BLK ;TELL USER THE BLOCK NUMBER JRST STOTAC ;GET NEXT (OR PREVIOUS) FREE BLOCK USRFRE: MOVEI TEM,SPACE ;BLOCKS "SPACE" APART LDB BLK,PIOMOD ;EXCEPT DUMP AND SAVMOD FILES CAIL BLK,SD ;OR ONE OF DUMP MODES? MOVEI TEM,2 ;YES, WHICH ARE CLOSRER USRFRA: HRRZ BLK,OBLK(DEVDAT) ;CURRENT BLOCK TLNE IOS,RVERSE ;FORWARD? JRST USRLST ;NO ADDI BLK,(TEM) ;YES, FIND NEXT BLOCK AT LEAST N CAILE BLK,TOPBLK TDZA BLK,BLK CALNXT: PUSHJ PDP,NXTFRE ;BLOCKS PAST THIS ONE JUMPN BLK,STOIOS ;RETURN IF FOUND TLOE TEM,1 ;FOUND NONE ON THIS PASS JRST NOBLKS ;TAPE IS FULL TLC IOS,RVERSE ;REVERSE DIRECTION HRRI TEM,1 ;START LOOKING AT NEXT BLOCK IN OTHER DIRECTION JRST USRFRA USRLST: SUBI BLK,(TEM) ;LOOK FOR FREE BLOCK N BEFORE SKIPG BLK TDZA BLK,BLK ;REVERSE IF AT FRONT OF TAPE USLSTA: PUSHJ PDP,LSTFRE ;THIS ONE JRST CALNXT+1 ;NO FREE BLOCKS AVAILABLE. GIVE HIGH BLOCK,SET IOBKTL LATER NOBLKS: MOVEI BLK,TOPBLK+1 ;SET HIGH BLOCK POPJ PDP, ;UTPCLR UUO UTPCLR: TRNE IOS,UDSD POPJ PDP, ;FORGET IT FOR NON-STANDARD MOVSI TAC,DVDIRIN ;SET DIRECTORY-IN-CORE BIT ORM TAC,DEVMOD(DEVDAT) TLO IOS,CHNGDR ;DIRECTORY HAS CHANGED HRRZ TAC,DLOC(DEVDAT) ;LOC OF DIRECTORY HRL TAC1,TAC HRRI TAC1,1(TAC) ;BLT POINTER SETZM (TAC) BLT TAC1,176(TAC) ;LEAVE LAST WORD IN DIR, ALONE MOVSI TAC1,17000 ;MARK DIRECTORY AS UNAVAILABLE MOVEM TAC1,16(TAC) MOVSI TAC1,757000 ;RESERVE BLOCKS 1 AND 2 MOVEM TAC1,(TAC) ;FOR READ IN MODE LOADER MOVSI TAC1,777770 ;MARK BLOCKS 1102-1105 AS ORCAM TAC1,NAMSTR-1(TAC) ;UNAVAILABLE ALSO JRST STOIOS ;CLOSE UUO UCLS: TLZE IOS,NOLINK ;IS LAST BLOCK NOT LINKED? TRNE IOS,UDSD ;AND NOT NON-STD? JRST STOIOS ;YES, RETURN LDB TAC,PIOMOD ;NO. WRITE LAST BLOCK CAIL TAC,16 ;DUMPO MODE? JRST CLSDMP ;YES. CLOSE DUMP MODE MOVEI TAC,@DEVOAD(DEVDAT) ;LOC OF BUFFER MOVE TAC1,1(TAC) ;LINK WORD TLON TAC1,-1 ;LINK=-1 IF NOT SPECIFIED MOVEM TAC1,1(TAC) ;LINK = -1... EOF MOVEM IOS,DEVIOS(DEVDAT) ;SAVE IOS JRST OUT ;GO TO WRITE RECORD ;HERE TO CLOSE A DUMP MODE FILE CLSDMP: TLO IOS,DMPCLS+IO+DMPMOD ;SET SWITCHES PUSHJ PDP,GETDT ;GET CONTROL SETZM BUF ;ENSURE ZERO LINK,WORDCOUNT SETZM BUF+1 ;MAKE SURE 0, SO CAN GET WITH 3 SERIES MON. ;FILES SAVED WITH 4 SERIES MONITOR. JRST OUFULL ;GO WRITE THE BLOCK ;RELEASE UUO UREL: PUSHJ PDP,WAIT1 ;MAKE SURE THE TAPE IS STOPPED PUSHJ PDP,NXTCM2 ;CLEAR OUT DUMP-MODE STUFF MOVSI TAC,DVDIRIN ;IF NONSTANDARD, WILL CLEAR TRZE IOS,UDSD ;CLEAR NON-STANDARD BIT. ANDCAM TAC,DEVMOD(DEVDAT) ;SO DIRECTORY WILL BE READ ANEW SKIPG DEVMOD(DEVDAT) ;IF DIRECTORY HAS BEEN TLZN IOS,CHNGDR ;MODIFIED IT MUST BE WRITTEN JRST UREL2 ;IT HASN'T BEEN CHANGED TLO IOS,IO PUSHJ PDP,GETDT ;WAIT TILL DTC AVAILABLE TLO IOS,RWDIR ;GOING TO WRITE DIRECTORY MOVEI BLK,DIRBLK ;BLOCK NUMBER PUSHJ PDP,WRTBLK ;WRITE UT PUSHJ PDP,WAIT1 ;WAIT TILL IT HAS BEEN WRITTEN UREL2: MOVE TAC,DEVIAD(DEVDAT) ;BITS 1,2 ARE COUNT OF CHANS TLNE TAC,200000 ;DEV INITED ON ANOTHER CHANNEL TOO? QUANTL: POPJ PDP,QUANT ;YES, DON'T ZAP IOS OR DDB ;SOME BITS IN THE IOS WORD AND THE DDB WILL NORMALLY BE CHANGED ON THE ;INTERRUPT LEVEL AFTER THE RELEASE, BUT HNGSTP CAN CAUSE THESE ACTIONS ;NEVER TO OCCUR, SO MAKE SURE THEY REALLY HAPPENED TLZ IOS,77600 ;ZERO IOS BITS SETZM OBLK(DEVDAT) ;AND OBLK SETZM IBLK(DEVDAT) ;ZERO IBLK SO WRITING A FILE AFTER READING ;IT WILL WORK (CHECK IS MADE AT ENTER) SETZM FSTBLK(DEVDAT) JRST STOIOS ;STORE IOS AND RETURN GETDT0: PUSHJ PDP,SETACT ;WAIT TILL TAPE COMES OUT OF REWIND PUSHJ PDP,WSYNC ;BEFORE DOING ANYTHING ELSE TO IT ;GET DEC TAPE CONTROLLER GETDT: TLNE IOS,REWBIT ;IF TAPE IS REWINDING NOW JRST GETDT0 ;WAIT TILL THRU BEFORE CONTINUING GETDT1: AOSE DTREQ ;CAN I HAVE IT PUSHJ PDP,DTWAIT ;NO. COME BACK LATER LDB TAC,PUNIT ;HAVE CONTROL NOW LSH TAC,11 ;CONNECT TO DTA CONO DTC,30000(TAC) ;SEE IF TAPE IS OK CONSZ DTS,100 ;SELECT ERROR? JRST QUEST ;YES. COMPLAIN TLNE IOS,IO ;NO. TRYING TO WRITE TAPE? CONSO DTS,4000 ;YES. WRITE PROTECTED? SKIPA TAC,QUANTL ;NO. EVERYTHING IS OK JRST QUEST ;YES. COMPLAIN HRRZM TAC,QUANTM ;SFT UP NUMBER OF BLOCK TO KEEP CONTROL FOR CONO DTC,10000 ;DESELECT CONTROL SO FNDBLK TEST ;WILL WORK RIGHT (CONCO DTC,20000) MOVEM DEVDAT,USEWRD ;SAVE ACS NEEDED ON INTERRUPT LEVEL JRST SETACT ;LIGHT IOACT AND RETURN ;COME HERE TO COMPLAIN ABOUT UNIT NOT RIGHT (SELECT OR PROTECT ERROR) QUEST: PUSHJ PDP,THRUTD ;GIVE UP CONTROL PUSHJ PDP,HNGSTP ;TYPE "DTAN OK?" ;NOTE -- AC BLK (=ITEM) USED TO BE ; PUSHED HERE, BUT IS NOT ANY LONGER ; BECAUSE HNGSTP NOW PRESERVES IT, ; AND THE STACK IS VERY FULL. JRST GETDT1 ;GET CONTROL AGAIN AND RETRY EXTERN JOBDDT,USRDDT ;DUMP MODE INPUT DMPI: IFN CPBIT, < HRRZ AC2,IBLK(DEVDAT) > TLZ IOS,IO PUSHJ PDP,DMPSET ;SET UP DUMP-MODE STUFF JRST ZERCOR ;ZER USER'S CORE IF SAVE-MODE ;INPUT UUO UIN: TLZ IOS,IO HRRZ BLK,IBLK(DEVDAT) ;BLOCK TO READ PUSHJ PDP,STOIOS TRNE IOS,UDSD ;NON STANDAR? JRST READBF JUMPE BLK,EOF ;0 MEANS EOF PUSHJ PDP,BLKCHK ;CHECK LEGALITY OF BLOCK NUMBER TLNN IOS,DMPMOD ;DUMP MODE? CAIE BLK,DIRBLK ;TRYING TO READ DIRECTORY? JRST READBF ;NO. GO READ ;READING DIRECTORY - GIVE CORE IMAGE IF IT EXISTS PUSHJ PDP,DIRCHK ;READ IT IF IT ISN'T IN ALREADY HRL TAC,DLOC(DEVDAT) ;LOC OF DIRECTORY MOVEI TAC1,@DEVIAD(DEVDAT) ;WHERE USER WANTS IT HRRI TAC,1(TAC1) ;LOC OF DATA BLT TAC,200(TAC1) ;GIVE IT TO HIM PUSHJ PDP,ADVBFF ;ADVANCE BUFFERS JFCL POPJ PDP, ;CHECK VALIDITY OF BLOCK NUMBER BLKCHK: CAIG BLK,TOPBLK ;LEGAL? POPJ PDP, ;YES. RETURN POP PDP,TAC TROA IOS,IOBKTL ;NO. LIGHT ERROR BIT ;INPUT BLOCK = 0 - END OF FILE EOF: TLO IOS,IOEND ;LIGHT EOF BIT TLNN IOS,DMPMOD JRST STOIOS JRST DMPEOF ;GIVE UP CONTROL IF DUMP-MODE ;ZERO USER'S CORE ON SAVE-MODE INPUT ZERCOR: MOVEI TAC,JOBDDT(PROG) ;ZERO CORE HRLI TAC,1(TAC) MOVSS TAC ;BLT POINTER HRRZ TAC1,DMPLST(DEVDAT) ;TOP CELL TO ZERO (-175) ADDI TAC1,(PROG) ;RELOCATE TO USER AREA SETZM -1(TAC) ;ZERO BLT TAC,(TAC1) SETZM USRDDT ;DDT IS KEPT IN PROTECTED PART JRST UIN ;DUMP MODE OUTPUT DMPO: PUSHJ PDP,DIRCHK ;MAKE SURE DIRECTORY IS IN CORE IFN CPBIT, < HRRZ AC2,OBLK(DEVDAT) > TLO IOS,IO PUSHJ PDP,DMPSET ;SET DUMPO-MODE POINTERS JFCL ;OUTPUT UUO UOUT: TLO IOS,IO TRNE IOS,UDSD ;NON STANDARD? JRST UOUT2 ;YES PUSHJ PDP,DIRCHK ;NO. MAKE SURE DIRECTORY IS IN CORE TLO IOS,IO ;IF DIRCHK READ, IO WENT OFF HRRZ BLK,OBLK(DEVDAT) CAIN BLK,DIRBLKK ;CHECK IF WRITING DIRECTORY JRST COR2HM ;YES, WRITE CORE IMAGE JUMPE BLK,FAKADV ;DONT WRITE IF NO BLOCK GIVEN PUSHJ PDP,BLKCHK ;CHECK FOR LEGAL BLOCK UOUT2: TLNN IOS,DMPMOD ;ALREADY HAVE CONTROL IF DUMP-MODE PUSHJ PDP,GETDT ;GET DEC TAPE CONTROLLER FILBUF: DTOCHK: TLNE IOS,DMPMOD ;DUMP MODE? JRST DMPFIL ;YES, FILL BUFFER FROM LIST MOVSI TAC,@DEVOAD(DEVDAT) ;LOCATION OF BUFFER ADD TAC,[XWD 1,BUF];SET TO STORE IN MONITOR BUFFER BLT TAC,BUF+177 ;GO BLT IT TLZ IOS,NOLINK OUFULL: TRNE IOS,UDSD ;NON-STANDARD? JRST OUTBL2 ;YES, NO FILE-STRUCTURED OPERATIONS HLRE BLK,BUF ;IS IT? JUMPL BLK,LSTBLK ;YES, - LAST BLOCK OF FILE JUMPN BLK,OUTBLK ;IF NON-0 - YES TLNE IOS,DMPCLS ;NO. LAST BLOCK OF A DUMPO FILE? ;DMPCLS WILL BE TURNED OFF AT THE INTERRUPT JRST OUTBLK ;YES. LINK MUST STAY 0 OUCOMP: PUSHJ PDP,USRFRE ;COMPUTE NEXT BLOCK TLO IOS,NOLINK ;THIS BLOCK NOT LINKED OUTBLK: HRLM BLK,BUF ;SAVE LINK IN 1ST WORD OF BLOCK MOVE TEM,FSTBLK(DEVDAT) ;STORE 1ST BLOCK OF FILE IN WORD DPB TEM,[POINT 10,BUF,27] HRRZ TEM,OBLK(DEVDAT) ;BLOCK TO WRITE NOW HRRM BLK,OBLK(DEVDAT) ;BLOCK TO WRITE NEXT MOVE BLK,TEM PUSHJ PDP,BLKCHK ;CHECK LEGALITY OF BLOCK PUSHJ PDP,MARKDR ;MARK BLOCK TAKEN IN DIRECTORY SKIPA BLK,TEM OUTBL2: HRRZ BLK,OBLK(DEVDAT) PUSHJ PDP,STOIOS WRTBLK: PUSHJ PDP,FNDBLK ;GO SEARCH FOR BLOCK MOVE TAC1,[BLKO DTC,700] ;HERE WE ARE - GO WRITE JRST RDWRT ;WRITE LAST BLOCK LSTBLK: MOVEI BLK,0 ;LINK=0 JRST OUTBLK ;GO WRITE LAST BLOCK ;TRYING TO WRITE DIRECTORY - STORE IN CORE COR2HM: MOVEI TAC,@DEVOAD(DEVDAT) ;WHERE IT IS HRLI TAC,1(TAC) HRR TAC,DLOC(DEVDAT) ;WHERE TO PUT IT MOVEI TAC1,177(TAC) BLT TAC,(TAC1) TLO IOS,CHNGDR ;REMEMBER TO WRITE IT OUT MOVSI TAC1,DVDIRI ORM TAC1,DEVMOD(DEVDAT) ;DIR. IS NOW IN CORE FAKADV: TLZE IOS,DMPMOD ;DUMP MODE? JRST THRUTD ;YES. GIVE UP CONTROL PUSHJ PDP,ADVBFE ;ADVANCE BUFFERS JFCL TLZ IOS,NOLINK ;DIRECTORY BLOCK IS NOT LINKED SETZM OBLK(DEVDAT) JRST STOIOS ;SET UP POINTERS AND STUFF FOR DUMP-MODE DMPSET: PUSHJ PDP,GETDT ;GET CONTROL TLO IOS,DMPMOD ;LIGHT BIT PUSHJ PDP,COMCHK ;CHECK VALIDITY OF LIST JRST SVADER ;NG. GIVE ADRESS ERROR SKIPL TAC,@UUO ;OK. NULL LIST? JRST DMPTS1 ;YES. RETURN IFN CPBIT, < TRNE IOS,UDSD ;NO. NON-STD MODE? SOJA DAT,TOUSER ;YES. GO ELSEWHERE > DMPST2: SOS UUO ;NO. SAVE START OF LIST (-1) MOVEM UUO,DMPLST(DEVDAT) JRST CPOPJ1 DMPTS1: POP PDP,TAC JRST THRUTD IFN CPBIT, < ;HERE TO START DUMP-MODE INTO USER AREA DIRECTLY TOUSER: JUMPE AC2,NOBLK0 ;CANT READ BLK 0 IN NON-STD DUMP MODE ASH DAT,-7 ;NUMBER OF WRDS IN LIST /200 AOS DAT MOVEM DAT,BLKCNT ;SAVE TO UPDATE POSITION MOVEI UUO,@UUO ;REAL ADDRESS OF LIST TOUSR1: MOVEM UUO,USPNTR ;SAVE IT MOVEM UUO,SVPNTR ADDI TAC,(PROG) ;RELOCATE ADDRESS OF 1ST IOWD MOVEM TAC,PNTR ;AND SAVE IT MOVE TAC,[JSR DMPADV] ;SET UP LOC FOR WHEN MOVEM TAC,DTALC2 ;IOWD IS EXHAUSTED HRRZM PROG,ADRPRG ;SAVE JUST ADDRESS OF PROG TLO IOS,NOBUF ;INDICATE DIRECTLY TO USER TLNN IOS,IO JRST CPOPJ1 ;READING - CONTINUE POP PDP,TAC ;WRITING - THIS WILL SAVE LOTS OF TIME JRST OUTBL2 NOBLK0: TRO IOS,IOIMPM POP PDP,TAC ;RETURN TO UUOCON WITH ERROR BIT SET JRST THRUTD > ;FILL OUTPUT BUFFER FROM LIST DMPFIL: MOVSI TAC1,-177 IFE CPBIT, < TRNE IOS,UDSD SUB TAC1,ONEONE ;200 DATA WORDS IF NON-STANDARD > DMPFLB: PUSHJ PDP,NXTCOM ;GET NEXT COMMAND JRST DMPOTH ;END OF LIST DMPFLA: MOVE TEM,(TAC) ;GET NEXT WORD MOVEM TEM,BUF+1(TAC1) ;INTO BUFFER AOBJP TAC1,DMPOVR ;BUFFER FULL IF GOES AOBJN TAC,.-3 ;GET NEXT WORD FROM COMMAND JRST DMPFLB ;GET NEXT COMMAND DMPOTH: IFE CPBIT, < TRNN IOS,UDSD > HRRZM TAC1,BUF ;LIST RAN OUT SAVE WORD COUNT SETZM BUF+1(TAC1) ;ZERO REST OF BUFFER HRRZI TAC1,BUF+2(TAC1) CAILE TAC1,BUF+177 ;JUST ZERO 1 WORD IF AT TOP JRST OUFULL HRLI TAC1,-1(TAC1) BLT TAC1,BUF+177 ;****TEST IF TOP OF BUFFER JRST OUFULL ;NOW WRITE BUFFER ;BUFFER FULL BEFORE END OF COMMAND DMPOVR: AOBJN TAC,.+3 ;WAS THAT LAST WORD OF COMMAND? PUSHJ PDP,NXTCOM ;YES. GET NEXT MOVEI TAC,0 MOVEM TAC,SVDWRD(DEVDAT) ;NO. SAVE REMAINDER OF COMMAND DMPOVA: MOVEI TAC,177 IFE CPBIT, < TRNN IOS,UDSD > MOVEM TAC,BUF ;WD CNT =177 JRST OUFULL ;GO WRITE PART OF STUFF ;GET NEXT COMMAND FROM LIST NXTCOM: SKIPN DMPLST(DEVDAT) ;END OF COMMANDS? JRST NXTCM2 ;YES. RETURN AOSA TAC,DMPLST(DEVDAT) ;GET NEXT COMMAND NXTCM1: HRRM TAC,DMPLST(DEVDAT) ;STORE GO-TO ADDRESS MOVE TAC,@TAC ;GET COMMAND JUMPE TAC,NXTCM2 ;END OF LIST JUMPG TAC,NXTCM1 ;GO-TO WORD ADDI TAC,(PROG) ;REAL COMMAND - ADD RELOCATION AOJA TAC,CPOPJ1 ;AND RETURN ;END OF DUMP-MODE LIST NXTCM2: SETZM SVDWRD(DEVDAT) ;ZERO POINTERS SETZM DMPLST(DEVDAT) POPJ PDP, DMPFLC: SKIPE TAC,SVDWRD(DEVDAT) ;IS THERE ANOTHER COMMAND JRST DMPFLA ;YES. GET IT JRST DMPTH2 ;NO. THROUGH DTC=320 DTS=324 ;IO INTERFACE READBF: TLNN IOS,DMPMOD ;HAVE CONTROL IF DUMP-MODE ; UNLESS ON A LOOKUP, IN WHICH ; CASE ALWAYS GET DT CONTROL RDBLUK: PUSHJ PDP,GETDT ;GET DT CONTROL READBC: PUSHJ PDP,FNDBLK ;SEARCH FOR RIGHT BLOCK MOVE TAC1,[BLKI DTC,300] ;FOUND IT - START READING ;HERE WITH BLK=BLOCK NUMBER, TAC1=FUNCTION, START SEARCH RDWRT: HLLM TAC1,IOWD ;BLKI OR BLKO HRLI TAC,-200 TLNN IOS,RWDIR ;WRITING (READING) DIRECT? SKIPA TAC,BFPNTR ;NO. INTO BUF HRR TAC,DLOC(DEVDAT) ;YES. LOC OF DIRECTORY CONSZ DTC,100000 ;IN REVERSE? JRST IORVRS ;YES SOS TAC ;ADDRESS -1 MOVE TEM,IOWD ;GET IOWD IOGO: MOVEM TEM,DTALOC ;SET UP INTERRUPT LOCATION IFN CPBIT, < TLNE IOS,NOBUF ;IF DIRECTLY TO USER JRST IOGO2 ;DTALC2, PNTR ALREADY SET UP > MOVEM TAC,PNTR ;POINTER MOVE TAC,[JSR DTATHR] ;SET UP INTERRUPT LOC+1 MOVEM TAC,DTALC2 IOGO2: CONO DTC,DTBOTH(TAC1) ;START READ OR WRITE CONO DTS,770000 ;ENABLE FOR ALL INTERRUPTS POPJ PDP, ;DISMISS INTERRUPT ;HERE IF TAPE IS GOING IN REVERSE WHEN BLOCK NUMBER FOUND IORVRS: ADDI TAC,176 ;START AT TOP OF BUFFER MOVE TEM,[JSR RVERS] JRST IOGO ;COMPILCATED STUFF FOR EACH WORD ;HERE FOR AY DATA WORD WITH TAPE IN REVERSE RVERS: 0 IOWD: BLKI DTC,PNTR ;READ (WRITE) A WORD ; NOTE -- THIS LOCATION IS IMPURE. ; MODIFIED TO A BLKI OR BLKO. JRST RVTHRU ;POINTER RAN OUT SOS PNTR ;POINTER HAS TO BACK UP SOS PNTR JEN @RVERS ;DISMISS THE INTERRUPT ;HERE WHEN POINTER RUNS OUT IN REVERSE RVTHRU: CONO DTS,770001 ;FUNCTION STOP JEN @RVERS ;DISMISS ;HERE WHEN POINTER RUNS OUT FORWARD DTATHR: 0 CONO DTS,770001 ;FUNCTION STOP JEN @DTATHR ;DISMISS ;HERE TO PERFORM A REWIND MTAPE FOR DTA MTAP0: PUSHJ PDP,GETDT ;GET THE CONTROL FOR THE TAPE LSH TAC1,15 ;TAC1=0 FOR REQ; 10 FOR REW UNLD TDZ IOS,[XWD IO,IOACT] ;SET UP IOS TLO IOS,REWBIT+RVERSE(TAC1) MOVEI BLK,0 ;SEARCH FOR BLOCK 0 PUSHJ PDP,FNDBLK ;GO FIND BLOCK ;CONTROL COMES HERE ON INTERRUPT CHANNEL WHEN THE BLOCK IS FOUND TLNE IOS,RUNBIT ;REWIND UNLOAD? JRST .+3 ;YES, CONTINUE CONO DTS,770001 ;NO, THROUGH WITH TAPE. - FNCTN STOP POPJ PDP, ;DISMISS INTERRUPT MOVE TAC,RUNWD ;USE THE CLOCK TO DESELECT THE TAPE JSR CLKREQ ;FOR A WHILE - IT WILL GO OFF THE END CONO DTC,410000 ;DESELECT THE TAPE SO IT CAN GO OFF POPJ PDP, ;DISMISS THE INTERRUPT RUNWD: XWD RUNCLK,200 ;COME HERE ON THE CLOCK LEVEL FOR REWIND AND UNLOAD RUNCLK: MOVE DEVDAT,USEWRD LDB TAC,PUNIT ;GIVE CONO TO READ BLOCK NOS IN FORWARD LSH TAC,11 ;DIRECTION - THIS WILL CAUSE FULL REEL CONO DTC,230200(TAC);TO STOP FLAPPING WHEN CONO STOP IS DONE MOVE IOS,DEVIOS(DEVDAT) ;RESET IOS JRST REWDUN ;DECREASE DTREQ. STOP TAP ;HERE TO PUT C(TAC) IN THE CLOCK QUEUE CLKREQ: 0 CONO PI,PIOFF ;TURN OFF PI IDPB TAC,CLOCK CONO PI,PION JRST @CLKREQ EXTERN JOB EXTERN HNGSTP ;COME HERE TO START READING BLOCK NUMBERS FNDBLK: HRRZM BLK,BLOCK ;BLOCK WE'RE LOOKING FOR POP PDP,DISPAD(DEVDAT) ;WHERE TO GO WHEN RIGHT BLOCK FOUND SETZM ERRCNT FNDBL2: LDB TAC,PUNIT ;GET UNIT NUMBER LSH TAC,11 ;POSITION IT CONSZ DTC,20000 ;TAPE SELECTED? JRST FNDBL4 ;YES TRO TAC,230000 ;NO, SET TO SELECT TAPE FORWARD TLNE IOS,RVERSE+NOBUF ;REVERSE OR DIRECT TO USER? TRC TAC,300000 ;YES. SET FOR REVERSE FNDBL3: TRO TAC,DTBOTH ;ADD PI ASSIGNMENT MOVE TEM,[JSR SRCH] ;SET UP PI LOCS FOR SEARCH MOVEM TEM,DTALOC ;INTO PI INTERRUPTCELL CONO DTC,200(TAC) ;START SEARCHING BLOCKS CONO DTS,670000 ;ENABLE FOR ALL BUT JOB DONE SETOM IOWRIT ;SET SWITCH NON - 0 IF USING TLNN IOS,RWDIR ;MONITOR BUFFER FOR OUTPUT TLNN IOS,IO ;SO REKON WONT GIVE CONTROL (AND SETZM IOWRIT ;BUFFER) AWAY TLZ IOS,RECKON+IOFST ;TURN OFF DEAD-RECKON BIT MOVEM DEVDAT,USEWRD PUSHJ PDP,STOIOS ;SAVE IOS IFN CPBIT, < TLZ IOS,NOBUFC ;SET WORD NON-ZERO IF NOBUF ON HLRZM IOS,DIRCTN > POPJ PDP, ;AND LEAVE FNDBL4: CONSZ DTC,200000 ;DIRECTION TEST TROA TAC,200000 ;FORWARD TRO TAC,100000 ;REVERSE JRST FNDBL3 ;START SEARCH ;INTERRUPT HERE TO READ A BLOCK NUMBER SRCH: 0 MOVEM TAC,TEMP ;SAVE WORKING AC CONI DTS,TAC ;GET STATUS BITS TLNE TAC,2000 ;IS CONTROL STILL ACTIVE? JRST SRCHD ;YES. MUST BE IN "PSEUDO END-ZONE" DATAI DTC,TAC ;NO. READ A BLOCK NUMBER TLZ TAC,-1 ;INSURANCE CAILE TAC,TOPBLK ;LEGAL BLOCK NUMBER? JRST SRCHB ;NO. SET ERROR SWITCH SUB TAC,BLOCK ;NOW-WANTED IFN CPBIT, < SKIPE DIRCTN ;MUST BE GOING FORWARD IF DUMP-MODE JRST SRCHC ;DIRECTLY TO USER > JUMPE TAC,FOUND ;=0 IF WE'RE THERE SRCHA: CONSZ DTC,100000 ;IF TAPE IS IN REVERSE MOVNS TAC ;SWITCH TURN-AROUND TEST JUMPLE TAC,.+3 ;TEST FOR DISCONNECT IF DIRECTION IS CORRECT ;*** CONO DTC,DTTURN ;TURN AROUND JRST SRCHXT ;AND GO AWAY MOVMS TAC CAILE TAC,MINDIS ;WORTH WHILE TO DISCONNECT TAPE? JRST REKON ;YES. GO DISCONNECT SKIPLE DISCON ;NO. IS THERE A DISCON. TAPE ;WHICH HAS TIMED OUT? CAIG TAC,2 ;YES. WILL THIS SEARCH TAKE LONG? SKIPA ;NO CONO DTS,670002 ;YES. STOP DISCONNECTED TAPE SKIPE TAC,ALMSWT ;READING BLOCK NOS OF AN ALMOST ACTIVE DTA? JSR CLKREQ ;YES., GET ITS JOB BACK INTO MEMORY SRCHXT: MOVE TAC,TEMP ;RESTORE TAC SETZM ALMSWT JEN @SRCH ;AND DISMISS THE INTERRUPT ;HERE IF AN ILLEGAL BLOCK WAS READ FROM THE TAPE SRCHB: AOS TAC,ERRCNT ;BUMP ERROR COUNT CAIG TAC,DTTRY ;TRIED ENOUGH? JRST SRCHXT ;NO. READ ANOTHER BLOCK NUMBER SETOM BLOCK ;YES. BLOCK = -1 AS AN ERROR SWITCH CONO DTS,770001 ;FUNCTION STOP JRST SRCHXT ;GO AWAY IFN CPBIT, < SRCHC: CONSZ DTC,100000 ;GOING FORWARD? TLCA TAC,400000 ;NO. SWITCH TURN AROUND TEST. ENSURE FORWARD JUMPE TAC,FOUND ;GO IF FOUND FORWARD SKIPL TAC ;TURN AROUND? CONO DTC,DTTURN ;YES JRST SRCHXT ;READ ANOTHER BLOCK NUMBER > ;COME HERE IF CONTROL IS STILL ACTIVE AFTER READING A BLOCK NUMBER ;THIS MEANS THAT TAPE IS IN THE "PSEUDO END-ZONE" - EXTRA FILLERS ;INSERTED FOR THE BENEFIT OF THE PDP-9 SRCHD: CONO DTC,DTTURN ;TURN TAPE AROUND JRST SRCHXT ;AND EXIT THE INTERRUPT ;COME HERE WHEN A TAPE IS IN A LONG SEARCH ;IF THIS TAPE HAS NOT USED THE MONITOR BUFFER (READING), AND ;IF NO OTHER TAPES ARE DISCONNECTD, THIS ONE WILL BE, ;AND A CLOCK REQUEST WILL BE ENTERED FOR AN ESTIMATED TIME TO BLOCK. REKON: SKIPN IOWRIT ;MONITOR BUFFER FULL? SKIPGE DISCON ;ANOTHER TAPE DISCONNECTED? JRST SRCHXT ;YES, FORGET IT MOVEM TAC1,FNDTMP ;SAVE AN AC MOVE TAC1,DISTNC SUB TAC1,TAC ;CHECK SEQUENCE SOJN TAC1,TRYLTR ;JUMP IF NOT SEQUENTIAL BLOCKS EXCH DEVDAT,USEWRD ;NO. DISCONNECT FROM THIS ONE MOVSI TAC1,ALMACT ;SET TAPE AS ALMOST ACTIVE - SWAPPABLE AND ;SHUFFLABLE EVEN THOUGH ACTIVE ORM TAC1,DEVIOS(DEVDAT) LDB TAC1,PJOBN ;ASSOCIATED JOB NUMBER HRRM TAC1,MONB2 ;SAVE IN WD 2 OF MONITOR BUFFER HRLM DEVDAT,MONB2 ;SAVE ADDRESS OF DTA CONSZ DTC,200000 IMULI TAC,62 ;COMPUTE A TIME TO BLOCK CONSZ DTC,100000 ;BASED ON 50 MSEC/BLOCK FORWARD IMULI TAC,50 ;AND 40 MSEC/BLOCK IN REVERSE MSECPT: IDIVI TAC,.-. ;DIVIDE BY NO, MILLISECS/TIC CAILE TAC,3300 ;IF THE COMPUTED TIME IS TOO HIGH MOVEI TAC,30 ;LOOK AGAIN IN 1 1/2 SECOND MOVSI TAC1,RECKON ;LIGHT A BIT TO INDICATE THE TAPE IS IORM TAC1,DEVIOS(DEVDAT) ;DEAD RECKONING MOVE TAC1,FNDTMP ;RESTORE TAC1 HRRM TAC,TIMREQ ;SET UP A TIME REQUEST LDB TAC,PUNIT ;6 BITS OF INFORMATION SKIPN TAC ;UNIT 0 = 8 MOVEI TAC,10 LSH TAC,14 ;IS THE UNIT NUMBER ADD TAC,TIMREQ ;REQUEST THE MONITOR TO WAKE JSR CLKREQ ;IN N TICKS MOVE TAC,BLOCK ;SAVE THE BLOCK NO. CONSO DTC,200000 ;AND THE DIRECTION TRO TAC,200000 HRLM TAC,IBLK(DEVDAT) ;IN THE DDB CONO DTC,410000 ;DESELECT THE CONTROL ;BIT 400000 IS TO PREVENT ERROR FLAGS FROM COMING IN LATER - ; IT DOES NOT CAUSE THE DESELECTED TAPE TO STOP THOUGH MOVEI DEVDAT,0 EXCH DEVDAT,USEWRD ;RESET DEVDAT SKIPLE DISCON ;SWITCHING DISCONNNECTED TAPES? JRST NXTICK ;YES. COME BACK LATER SOSL DTREQ ;NO. COUNT DOWN DTREQ SETOM DTAVAL SETOM DISCON ;ONLY 1 RECKON AT A TIME JRST SRCHXT ;AND EXIT THE INTERRUPT TRYLTR: MOVEM TAC,DISTNC MOVE TAC1,FNDTMP ;RESTORE TAC1 JRST SRCHXT ;HERE WHEN SWITCHING DISCONNECTED TAPES ;TOO MUCH TO DO ON THE INTERRUPT LEVEL. SO COME BACK ON ;NEXT CLOCK TICK NXTICK: MOVE TAC,TIMRQ2 ;COME BACK IN A JIFFY JSR CLKREQ JRST SRCHXT TIMREQ: XWD BACK,0 TIMRQ2: XWD BACKA,1 IFN ALMACT,< EXTERN PRIIN ;COME HERE ON THE CLOCK LEVEL TO BRING THE JOB ASSOCIATED WITH ;AN "ALMOST ACTIVE" TAPE BACK INTO CORE ALMREQ: XWD .+1,1 MOVE DEVDAT,USEWRD ;DDB LOC LDB ITEM,PJOBN ;JOB NUMBER PUSHJ PDP,PRIIN ;TELL SWAPPER TO GET IT JFCL MOVSI TAC,ALMACT ANDCAM TAC,DEVIOS(DEVDAT) ;ZAP BIT SO IT WONT BE SWAPPED OUT AGAIN POPJ PDP, ;HERE WHEN SWAPPER DOES GET THE JOB BACK INTO CORE SWPBAK: MOVE IOS,DEVIOS(DEVDAT) SETZM MONB2 ;CLEAR JOB NO, FROM MON BUFFER TLNN IOS,IOFST ;WAS JOB SWAPPED OUT WHEN DATA FINISHED? POPJ PDP, ;NO. TRANSFER COMPLETED MOVE TAC,JBTSTS(ITEM) ;YES, WAS IO ABORTED? TRNN TAC,ALBORT JRST FAKINT ;NO. NOW TRANSFER DATA, ADVANCE BUFFERS JRST THRUTP ;YES. FORGET REST OF OPERATION > EXTERN CIPWTM ;COME HERE FROM THE MONITOR WHEN THE ESTIMATED TIME-TO BLOCK ;HAS EXPIRED BACK: SKIPE USEWRD ;IS CONTROL AVAILABLE? JRST FLAGIT ;NO. SET FLAG AOS DTREQ ;YES. DTREQ WILL BE COUNTED DOWN LATER SETZM DTAVAL SETZM DISCON ;NO TAPE IS NOW DISCONNECYTED BACK2: TRZ TAC,10 LSH TAC,11 ;UNIT PUSH PDP,TAC ;SAVE IT LSH TAC,3 ADD TAC,DTADDB ;CONVERT TO SIXBIT NAME PUSHJ PDP,DEVPHY ;SET UP DEVDAT FOR IT HALT . ;****************************** MOVEM DEVDAT,USEWRD ;RESET USEWRD HLRZ TAC1,IBLK(DEVDAT) ;BLOCK NEEDED DPB TAC1,[POINT 10,BLOCK,35] HRRZ TAC,CLOCK HRLI TAC1,CPOPJ ;FIND CLOCK-QUEUE REFERENVCE TO BACKC BACK3: CAIN TAC,CIPWTM JRST BACKD ;NOT THERE, TAPE MUST HAVE BEEN STOPPED HLRZ TEM,(TAC) ;ADDRESS OF CLOCK REQUEST CAIE TEM,BACKC ;THIS THE ONE? SOJA TAC,BACK3 ;NO. KEEP LOOKING HLLM TAC1,(TAC) ;YES. MAKE A NO-OP OUT OF IT BACKD: POP PDP,TAC ;UNIT TRO TAC,270000 ;SET SELECT, DELAY INHIBIT TRNE TAC1,200000 ;SET DIRECTION TRC TAC,300000 ;LREVERSE MOVE IOS,DEVIOS(DEVDAT) ;RESTORE OS IFN ALMACT, < ;UNTIL REST OF SCHEDR, SWAPPER IS FIXED - IGNORE MOVE TAC1,ALMREQ ;INDICATE CONNECTING TO AN ALMOST MOVEM TAC1,ALMSWT ;ACTIVE TAPE, SO JOB WILL BE BROUGHT ;BACK IN IF TAPE CLOSE TO TARGET BLOCK > JRST FNDBL3 ;READ NEXT BLOCK NUMBER ;HERE WHEN TIME IS UP AND ANOTHER TAPE HAS THE CONTROL FLAGIT: MOVEM TAC,DISCON ;DISCON POSITIVE IF NEED THE CONTROL MOVE TAC,.+3 ;SET A CLOCK REQUEST TO STOP TAPE JSR CLKREQ POPJ PDP, ;RETURN, WILL COME IN ON INTERRUTP LEVEL XWD BACKC,10 ;HERE WHEN DTASER CAN GIVE UP THE CONTROL BACKB: CONO DTC,400000 ;STOP CURRENT TAPE PUSHJ PDP,THRUTA ;GIVE IT UP TDZA TAC,TAC ;DISCON WILL GO TO 0 BACKA: SETOM TAC ;DISCON WILL GO TO -1 EXCH TAC,DISCON ;UNIT TO CONNECT TO JRST BACK2 ;GO RECONNECT ;IF WE GET HERE THERE IS A SLOW TAPE ON THE SELECTED DRIVE BACKC: CONO PI,PIOFF ;CANT RISK CHANGING THE INTERRUPT ENABLES HRE CONI DTS,TAC ;READ IN ENABLE FLAGS HLRZS TAC ;FLAGS INTO R.H. ANDI TAC,770000 ;ONLY ENABLE FLAGS CONO DTS,2(TAC) ;STOP THE DESELECTED TAPE CONO PI,PION POPJ PDP, ;BEFORE RUNNING OFF END OF THE REEL ;HERE WHEN CORRECT BLOCK NUMBER IS FOUND FOUND: MOVEM TAC1,FNDTMP ;SAVE THOSE ACS THAT WILL BE USED MOVEM TEM,RVERS EXCH DEVDAT,USEWRD EXCH IOS,DEVIOS(DEVDAT) EXCH PDP,FNDPDP PUSHJ PDP,@DISPAD(DEVDAT) ;GO TO DISPATCH LOCATION EXCH PDP,FNDPDP ;RESTORE ACS EXCH IOS,DEVIOS(DEVDAT) EXCH DEVDAT,USEWRD MOVE TAC,TEMP MOVE TAC1,FNDTMP MOVE TEM,RVERS JEN @SRCH ;EXIT THE INTERRUPT FNDPDP: XWD -2,. 0 IFN CPBIT, < ;HERE WHERE DUMP-MODE POINTER RUNS OUT DMPADV: 0 MOVEM TAC,TEMP AOSA TAC,USPNTR ;ADVANCE LOC OF POINTER DMPAV1: HRRM TAC,USPNTR SKIPN TAC,@TAC ;END OF LIST? JRST DMPAV3 ;YES. STOP TAPE ADD TAC,ADRPRG ;ADD RELOCATION JUMPG TAC,DMPAV1 MOVEM TAC,PNTR ;NEW POINTER DMPAV2: MOVE TAC,TEMP ;RESTORE TAC JEN @DMPADV DMPAV3: CONO DTS,770001 ;GIVE FUNCTION STOP JRST DMPAV2 ;RESTORE TAC AND EXIT THE INTERRUPT > ;INTERRUPT HERE FOR FLAG CHANNEL DTAINT: CONSO DTS,770000 ;INTERRUPT FOR DTA? JRST . ;NO CONSZ DTS,20000 ;END ZONE? SKIPGE BLOCK ;YES. BAD BLOCK NUMBER? SKIPA ;YES JRST TURN ;NO. TURN TAPE AROUND JSR DTASAV ;SAVE ACS FAKINT: MOVE DEVDAT,USEWRD ;RESTORE DEVDAT MOVE IOS,DEVIOS(DEVDAT) ;AND IOS LDB ITEM,PJOBN ;JOB NUMBER IFN ALMACT,< PUSHJ PDP,PRIIN ;IS JOB SWAPPED OR SHUFFLED? JRST SWPDLY ;YES, CANT MOVE BUFFERS NOW > MOVE PROG,JBTADR(ITEM) ;ADDRESS DTAIN1: TLZE IOS,REWBIT ;NO, FROM A REWIND MTAPE? JRST REWDUN ;YES. DONE TLZE IOS,IOFST ;COMING FROM SWAP DELAY ROUTINE? JRST DTAIN2 ;YES, TD10 HAS BEEN ZAPPED CONSZ DTS,100000 ;JOB DONE? CONSZ DTS,670000 ;AND NO ERRORS? JRST ERRS ;NO. TOUGH LUCK SKIPGE BLOCK ;BAD BLOCK NUMBER ON TAPE? JRST DERR ;YES, TURN ON IODERR DTAIN2: TLNE IOS,DMPMOD ;DUMP MODE? JRST DMPTHR ;YES. GO ELSEWHERE TLNN IOS,SINGL JRST .+3 LDB TAC,[POINT 10,BUF,27] ;GET 1ST BLOCK NO. IF READ ;CAME FROM LOOKUP MOVEM TAC,IBLK(DEVDAT) ;STORE IN DDB TLZE IOS,IOW ;NO. IN IO WAIT? PUSHJ PDP,SETIOD ;YES. TAKE OUT OF WAIT TLZE IOS,SINGL+RWDIR+DMPCLS ;DIRECTORY OPERATION OR ;CLOSING DUMP FILE? JRST THRUTP ;YES. LEAVE TLNE IOS,IO ;WRITING? JRST OUTHRU ;YES EXTERN JBTSTS,PJOBN ;HERE ON END OF AN INPUT BLOCK HRROI TAC1,177 ;MASK OUT 1ST-BLK DATA TRNN IOS,UDSD ;UNLESS IN NON-STD ANDM TAC1,BUF MOVEI TAC,@DEVIAD(DEVDAT) ;WHERE TO STORE BLOCK ADD TAC,[XWD BUF,1];FROM BUF TO THERE MOVEI TAC1,177(TAC) BLT TAC,(TAC1) ;TRANSFER IT HLRZ BLK,BUF ;NEXT BLOCK TO READ TRNE IOS,UDSD ;IF NON-STD AOSA BLK,IBLK(DEVDAT);READ SEQUENTIAL BLOCKS HRRM BLK,IBLK(DEVDAT) ;DAVE IN DDB TRNE IOS,IODTER+IODERR+IOIMPM JRST THRUIN PUSHJ PDP,ADVBFF ;GET NEXT BUFFER JRST THRUIN ;EMPTY BUF NOT AVAILABLE SKIPLE DISCON ;TAPE TIMED OUT? JRST BACKB ;YES. GO RECONNECT SKIPE BLK ;EXIT IF EOF OR BLOCK TOO LARGE CAILE BLK,TOPBLK ;THE ERROR WILL BE CAUGHT ON THE JRST THRUIN ;UUO LEVEL NEXT TIME AROUND SOSGE QUANTM ;HAS TAPE HAD CHAN LONG ENOUGH? SKIPG DTREQ ;YES. ANYONE ELSE WANT IT? JRST READBC ;NO. READ NEXT BLOCK THRUIN: HRRZ TAC,OBLK(DEVDAT) ;TAPE ALSO BEING WRITTEN? JUMPN TAC,THRUTP ;YES. DONT CHANGE REVERSE BIT TLZ IOS,RVERSE ;NO. SET IOS BIT TO CORRECT DIRECTION CONSZ DTC,100000 TLO IOS,RVERSE ;HERE WHEN TAPE IS DONE THRUTP: SKIPLE TAC,DISCON ;TAPE TIMED OUT? JRST BACKB ;YES CONO DTC,400000 ;STOP TAPE THRUTD: SOSL DTREQ ;BUMP COUNT DOWN SETOM DTAVAL ;TELL SCHEDULER THRUTA: CONO DTC,10000 ;DESELECT CONTROL TLZ IOS,DMPMOD+NOBUF+DMPCLS+REWBIT+RUNBIT SETZM USEWRD ;INDICATE CONTROL NOW FREE JRST CLRACT ;RESET IOACT AND RETURN ;COME HERE IF A TAPE IS HUNG HUNGTP: JUMPGE IOS,THRUTP ;GIVE UP CONTROL IF NOT DEAD-RECKONING JRST CPOPJ1 ;IGNORE IT IF DEAD RECKONING - ;WHEN THE TAPE TIMES OUT FNDBLK WILL RESET THE HUNG TIME, AND ;IF IT IS STILL HUNG AT ITS END THE ERROR MESSAGE WILL OCCUR INTERN FTSWAP EXTERN SHFWAT ;HERE ON END OF BLOCK WHEN THE JOB IS STILL SWAPPED OUT ;CONTROL GETS HERE IF SWP OR SHF IS ON IN JBTSTS ;IO THE JOB IS CURRENTLY SWAPPED OR SHUFFLED WE MUST DELAY ;SO TEST JOB NO AGAINST SHFWAT (IF SHUFFLE) OR FORCE (IF SWAP) TO DETERMINE ;IF JOB IS REALLY IN THAT STATE, OR IF MONITOR HAS LIT THE BIT ;IN ANTICIPATION OF PUTTING THE JOB IN THAT STATE SWPDLY: IFN FTSWAP, < EXTERN FORCE TLNE TAC1,SWP ;SWAPPED JOB? SKIPA TAC,FORCE ;YES. > MOVE TAC,SHFWAT ;NO. SHUFFLED? CAMN ITEM,TAC ;JOB REALLY SWAPPED OR SHUFFLED? JRST DTAIN1 ;NO, FINISH THIS DATA OPERATION CONO DTC,400000 ;YES, STOP TAPE (WE MUST DELAY) TLO IOS,IOFST ;INDICATE JOB WAS DELAYED (FOR FAKINT) MOVE TAC,[XWD FAKINT,1] ;IF JOB IS CURRENTLY BEING SHUFFLED TLNN TAC,SWP ;COME BACK ON NEXT CLOCK INTERRUPT, AT WHICH TIME JSR CLKREQ ;THE BLT MUST HAVE FINISHED JRST STOIOS ;AND GO AWAY ;HERE ON END OF OUTPUT BLOCK OUTHRU: PUSHJ PDP,ADVBFE ;GET NEXT BUFFER JRST THRUTP ;NOT FULL SKIPLE DISCON JRST BACKB HRRZ BLK,OBLK(DEVDAT) ;NEXT BLOCK TO WRITE CAILE BLK,TOPBLK ;LEGAL? JRST THRUTP ;NO. CATCH ERROR ON UUO LEVEL SOSGE QUANTM ;YES. HAD CHAN LONG ENOUGH? SKIPG DTREQ ;AND SOMEONE ELSE WANT IT? JRST FILBUF ;NO. GO WRITE NEXT BLOCK JRST THRUTP ;YES. GIVE UP TAPE ;TURN TAPE AROUND AFTER END-ZONE INTERRUPT TURN: CONSZ DTC,500 ;READ BLOCK NUMBERS? JRST DIREOF ;NO. END ZONE WHILE READING DATA CONO DTC,DTTURN ;YES. TURN AROUND JEN @DTACHL ;DISMISS INTERRUPT ;COME HERE ON AN END ZONE INTERRUPT WHILE READING DATA ;THIS CAN ONLY HAPPEN IN MODE 116,117 ;LIGHT IODEND (IT IS A PREMATURE EOF) AND LEAVE DIREOF: JSR DTASAV ;SAVE ACS MOVE DEVDAT,USEWRD ;RESTORE DEVDAT MOVE IOS,DEVIOS(DEVDAT) ;AND IOS JRST DMPEOF ;LIGHT IODEND AND RETURN ;COME HERE ON END OF DUMP MODE BLOCK SVDMTH: SKIPLE DISCON ;HAS A TAPE TIMED OUT CONO DTS,2 ;YES. STOP IT IFN CPBIT, < TLNE IOS,NOBUF ;DIRECTLY TO USER? JRST USDMTH ;YES. ALMOST THROUGH > MOVSI TAC1,-177 IFE CPBIT, < TRNE IOS,UDSD SUB TAC1,ONEONE ;SET UP TAC1 WITH COUNT > TLNN IOS,IO JRST SVDMIN ;INPUT FILE HRRZ BLK,OBLK(DEVDAT) ;OUTPUT FILE, NEXT BLOCK JUMPE BLK,DMPTHA ;LAST BLOCK IFE CPBIT, < TRNE IOS,UDSD ;IF NON-STD MODE AOSA OBLK(DEVDAT) ;WRITE CONSECUTIVE BLOCKS > CAIG BLK,TOPBLK ;NOT LAST. LEGAL BLOCK NUMBER? POPJ PDP, ;YES. RETURN TRO IOS,IOBKTL ;BLOCK TOO LARGE DMPTHA: POP PDP,TAC ;REMOVE THE RETURN ADDRESS FROM ;CALL TO SVDMTH. SINCE ;NO MORE I/O WILL BE DONE DMPTH2: SETZM SVDWRD(DEVDAT) ;ZERO DUMP-MODE STUFF SETZM DMPLST(DEVDAT) DMPTH3: TLZE IOS,IOW ;IS IO WAIT? PUSHJ PDP,SETIOD ;YES, RESTART JOB JRST THRUTP ;HERE ON END SAVE MODE INPUT BLOCK SVDMIN: HLRZ BLK,BUF ;NEXT BLOCK NUMBER IFE CPBIT, < TRNE IOS,UDSD ;NON-STANDARD? AOSA BLK,IBLK(DEVDAT) ;YES, READ CONSECUTIVE BLOCKS > HRRM BLK,IBLK(DEVDAT) ;SAVE IN DDB JRST CPOPJ1 IFN CPBIT, < ;HERE WHEN THROUGH DUMP-MODE DIRECTLY TO USER USDMTH: MOVEI TAC1,IBLK(DEVDAT) TLNE IOS,IO MOVEI TAC1,OBLK(DEVDAT) ;SET TAC1 TO RIGHT BLOCK NUMBER MOVE TAC,BLKCNT ;UPDATE BLOCK COUNTER ADDM TAC,(TAC1) JRST DMPTHA ;THROUGH > ;HERE WHEN THROUGH DUMP MODE BLOCK DMPTHR: PUSHJ PDP,SVDMTH ;END OF BLOCK HOUSEKEEPING ; RETURN ONLY IF MORE I/O ; WILL BE DONE JRST DMPFLC ;FILL BUFFER FOR NEXT OUTPUT ;HERE WHEN THROUGH READING A DUMP-MODE BLOCK DMIFIL: SKIPE TAC,SVDWRD(DEVDAT) ;PARTIAL COMMAND? JRST DMIFLB ;YES. CONTINUE DMIFLA: PUSHJ PDP,NXTCOM ;NO. GET NEXT COMMAND JRST DMPTH2 ;END OF LIST - THROUGH DMIFLB: MOVE TEM,BUF+1(TAC1) ;NEXT DATA WORD MOVEM TEM,(TAC) ;GIVE TO USER AOBJP TAC1,.+3 ;IF BUFFER IS FULL AOBJN TAC,DMIFLB ;GET NEXT WORD JRST DMIFLA ;GET NEXT COMMAND AOBJN TAC,.+3 ;BUFFER IO FULL. IS COUNT EXACTLY 177? PUSHJ PDP,NXTCOM ;THAT COM, IS DONE. GET NEXT JRST DMPTH2 ;END OF LIST - THROUGH MOVEM TAC,SVDWRD(DEVDAT) ;SAVE PARTIAL COMMAND FOR NEXT TIME JUMPE BLK,DMPEOF ;IF EOF - LIGHT BIT RDNXT: CAIG BLK,TOPBLK ;BLOCK LEGAL? JRST READBC ;GO READ BLOCK NUMBER TROA IOS,IOBKTL ;LIGHT ERROR BIT ;EOF BEFORE ALL DATA IS IN - DUMP MODE DMPEOF: TRO IOS,IODEND ;LIGHT EOF BIT JRST DMPTH2 ;GIVE UP TAPE SVADER: PUSHJ PDP,DMPTH2 ;GIVE UP CONTROL JRST ADRERR ;TYPE ERROR MESSAGE ;COME HERE ON ERROR ERRS: AOS TAC,ERRCNT ;BUMP COUNT IFN CPBIT, < TLNN IOS,NOBUF ;I/O DIRECT TO USER? JRST ERRS1 ;NO MOVE TAC1,SVPNTR ;YES. RESET POINTERS MOVEM TAC1,USPNTR MOVE TAC1,(TAC1) ;RESET PNTR ADD TAC1,ADRPRG MOVEM TAC1,PNTR > ERRS1: CONSO DTS,40000 ;IF ILLEGAL OP - DONT RETRY CAILE TAC,DTTRY ;ENOUGH REREADS? JRST PERMER ;YES. PERMANENT ERROR JRST FNDBL2 ;NO. TRY AGAIN ;PERMANENT ERROR PERMER: SKIPL BLOCK ;IF BAD BLOCK # LIGHT IODTER CONSZ DTS,400000 TRO IOS,IODTER ;PARITY CONSO DTS,10000 CONSZ DTS,200000 DERR: TRO IOS,IODERR ;MISSED DATA CONSZ DTS,40000 TRO IOS,IOIMPM ;ILLEGAL OP TLNE IOS,DMPMOD ;DUMP MODE? JRST DMPTHR ;YES. NOT THROUGH YET TLNN IOS,IO+RWDIR+SINGL JRST DTAIN2 REWDUN: TLZE IOS,IOW PUSHJ PDP,SETIOD ;NO. TAKE OUT OF IO WAIT TLZN IOS,RWDIR+SINGL ;DIRECTORY OPERATION? JRST THRUTP ;NO. RETURN TO USER PUSHJ PDP,THRUTP ;YES. STOP TAPE MOVSI TAC,DVDIRIN ;CLEAR DIRECTORY IN CORE BIT ANDCAM TAC,DEVMOD(DEVDAT) BDDIR: LDB ITEM,PJOBN ;NUMBER OF OFFENDING JOB JRST BADDIR ;GO PRINT ERROR MESSAGE INTERN DTABUF BFPNTR: IOWD 200,BUF+1 ONEONE: XWD 1,1 USEWRD: 0 USEPRG: 0 ADRPRG: 0 PNTR: 0 TEMP: 0 DISTNC: 0 BLOCK: 0 QUANTM: 0 DISCON: 0 ERRCNT: 0 FNDTMP: 0 IOWRIT: 0 ALMSWT: 0 IFN CPBIT, < BLKCNT: 0 SVPNTR: 0 USPNTR: 0 DIRCTN: 0 > ;THIS IS THE MONITOR BUFFER DTABUF: IFN ALMACT,< XWD SWPBACK,0 ;RH WILL BE LINK TO NEXT MONITOR BUFFER > MONB2: 0 BUF: BLOCK 200 DTAEND: END