TITLE DTCSRN - NEW FORMAT DECTAPE SERVICE FOR 551 (PDP-6) SUBTTL DTA551 A.WACHS/TW/RCC 01 JUN 69 V012 XP VDTASR,012 ;GLOBAL VERSION NUMBER FOR LOADER STORAGE MAP. ENTRY DTCSRN ;ENTRY POINT FOR SELECTIVE LOAD BY BUILD DTCSRN: EXTERNAL TPOPJ,TPOPJ1,DTCCHL,DCOUT,DCIN,DCON,DCOFF EXTERNAL STOIOS,STOTAC,SETACT,CLRACT,OUT,DTCSAV,PIOMOD EXTERNAL DTAVAL,DTREQ,SETIOD,THSDAT,PUNIT,GETDCDT EXTERNAL ADVBFE,ADVBFF,ADRERR,WAIT1,CPOPJ,CPOPJ1,BADDIR EXTERNAL COMCHK,PJOBN,RELEA9,UADCK1,DTTRY EXTERNAL JBTADR,DCLOC,DCLOC1,DTCCHN,DCREQ,DCAVAL BLK=4 DIRBLK=^D100 ;NUMBER OF BLOCK FOR DIRECTORY TOPBLK=1101 ;HIGHEST LEGAL BLOCK NUMBER NAMSTR=^D83 ;1ST NAME WORD IN DIRECTORY QUANT=5 ;NUMBER OF BLOCKS CAN READ BEORE GIVING UP DTC SPACE=6 ;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 ;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 CPBIT=-1 ;CONDITIONAL ASSEMBLY PARAMETER FOR I/O DIRECTLY ;TO USER. IF -1 THE I/O IN DUMP MODE WITH ;BIT 29 ON IN INIT WILL DO IO DIRECTLY TO USER ;WITHOUT DIRECT CONSIDERATION OF BLOCK BOUNDRIES INTERN DTCINT,DTCDDB,DTCINI,DTCDDS DTCDDB: SIXBIT /DTA0/ XWD ^D60*HUNGST,200 0 EXP DTCDSP XWD 1107,154403 EXP 0,0 XWD PROG,0 XWD PROG,0 EXP 0,0,0 EXP DTCDIR EXP 0,0,0,0,0 DTCDIR: BLOCK 200 DTCDDS=.-DTCDDB JRST DTCINI JRST THRUTP ;HUNG DEVICE DTCDSP: 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 POPJ PDP, ;MTAPE ;INITIALIZE DTC DTCINI: CONO DTC,0 CONO DC,0 HLLZS DTCINT ;CLEAR CONSO 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,.+3 ;FOUND IF BLK NOT =0 LOOKD: PUSHJ PDP,BLKSRC ;FIND FIRST MENTION IN DIRECTORY JRST BDDIR ;NOT THERE - ERROR PUSHJ PDP,READBF ;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 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,400000 ;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 ;RELEASE UUO UREL: SETZM FSTBLK(DEVDAT) ;ZERO FSTBLK PUSHJ PDP,NXTCM2 ;CLEAR OUT DUMP-MODE STUFF TRZ IOS,UDSD ;CLEAR NON-STD BIT. SKIPG DEVMOD(DEVDAT) ;IF DIRECTORY HAS BEEN TLZN IOS,CHNGDR ;MODIFIED IT MUST BE WRITTEN POPJ PDP, ;NOT TOUCHED TLO IOS,RWDIR+IO ;GOING TO WRITE IT PUSHJ PDP,GETDT ;WAIT TILL DTC AVAILABLE MOVEI BLK,DIRBLK ;BLOCK NUMBER PUSHJ PDP,WRTBLK ;WRITE UT JRST WAIT1 ;DONT RETURN TO USER TILL DONE ;GET DEC TAPE CONTROLLER GETDT: PUSHJ PDP,GETDCDT ;GET DATA CONTROL. DECTAPE CONTROL AOSE DTREQ ;ARGUMENT FOR GETDCD MOVEI TAC,QUANT ;HAVE IT NOW MOVEM TAC,QUANTM ;KEEP IT FOR QUANT BLOCKS MOVEM PROG,USEPRG MOVEM DEVDAT,USEWRD ;SAVE ACS NEEDED ON INTERRUPT LEVEL JRST SETACT ;LIGHT IOACT AND RETURN ;HERE TO CLOSE A DUMP MODE FILE CLSDMP: TLO IOS,CLSDMP ;SET SWITCHES PUSHJ PDP,GETDT ;GET CONTROL SETZM BUF ;ENSURE LINK, WORDCOUNT=0 JRST OUFULL ;GO WRITE THE BLOCK EXTERN JOBDDT,USRDDT ;DUMP MODE INPUT DMPI: IFN CPBIT, < HRRZ AC2,IBLK(DEVDAT) > 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) > 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 HRRZ BLK,OBLK(DEVDAT) CAIN BLK,DIRBLK ;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 SKIPN BUF ;GIVE UP TAPE IF JRST THRUTP ;NO BUFFER TO OUTPUT 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 TLZE IOS,DMPCLS ;NO. LAST BLOCK OF A DUMPO FILE? 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,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 DC,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,400000 ORM TAC1,DEVMOD(DEVDAT) ;DIR. IS NOW IN CORE FAKADV: TLZN IOS,DMPMOD 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: TLO IOS,DMPMOD ;LIGHT BIT PUSHJ PDP,GETDT ;GET CONTROL HRLI UUO,PROG PUSHJ PDP,COMCHK ;CHECK VALIDITY OF LIST JRST SVADER ;NG. GIVE ADRESS ERROR SKIPN 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 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,DCLOC1 ;IOWD IS EXHAUSTED HRRZM PROG,ADRPRG ;SAVE JUST ADDRESS OF PROG TLO IOS,NOBUF ;INDICATE DIRECTLY TO USER XCT @1(PDP) ;TURN ON/OFF IO TLNN IOS,IO JRST CPOPJ1 ;READING - CONTINUE POP PDP,TAC ;WRITING - THIS WILL SAVE LOTS OF TIME JRST OUTBL2 > ;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=210 DTS=214 ;IO INTERFACE READBF: TLNN IOS,DMPMOD ;HAVE CONTROL IF DUMP-MODE PUSHJ PDP,GETDT ;GET DT CONTROL READBC: PUSHJ PDP,FNDBLK ;SEARCH FOR RIGHT BLOCK MOVE TAC1,[BLKI DC,300] ;FOUND IT - START READING ;HERE WITH BLK=BLOCK NUMBER, TAC1=FUNCTION, START SEARCH RDWRT: PUSH PDP,TAC 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 SOS TAC ;NO. SET FOR FORWARD READ IOGO: IFN CPBIT, < TLNN IOS,NOBUF ;POINTER ALREADY SET UP IF DIRECT IO > MOVEM TAC,PNTR ;POINTER OR TAC1,UNIT ;UNIT AND PI CHAN MOVEM TAC1,COMAND ;SAVE COMMAND FOR READ OR WRITE POP PDP,TAC ;RESTORE SEARCH COMMAND CONO DC,DCIN ;SET DATA CONTROL TO READ CONO PI,DCON ;TURN ON DC PI CHANNEL HRLI TAC,37 CONO PI,PIOFF CONO DTC,(TAC) ;START TAPE MOVING HLRM TAC,DTCINT CONO PI,PION POPJ PDP, ;DISMISS INTERRUPT ;HERE FOR ANY DATA WORD WITH TAPE IN REVERSE RVERS: 0 IOWD: BLKI DC,PNTR ;READ (WRITE) A WORD 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: JSR SHUTDN ;SHUT DOWN DATA CONTROL JEN @RVERS ;DISMISS ;HERE WHEN POINTER RUNS OUT FORWARD DTATHR: 0 JSR SHUTDN ;SHUT DOWN DATA CONTROL JEN @DTATHR ;DISMISS SHUTDN: 0 CONSZ DC,10000 ;DATA MISSED? SETOM ERRFLG ;YES. SET SWITCH CONSO DTC,400 ;READING? CONO DC,0 ;YES. TURN OFF DC CONO PI,DCOFF ;TURN OFF DC PI JRST @SHUTDN ;COME HERE TO START READING BLOCK NUMBERS EXTERN PION,PIOFF FNDBLK: HRRZM BLK,BLOCK ;BLOCK WE'RE LOOKING FOR SETZM ERRCNT FNDBL2: SETZM ERRFLG ;RESET DATA MISSED FLAG LDB TAC,PUNIT ;GET UNIT NUMBER LSH TAC,3 ;POSITION IT TRO TAC,DTCCHN ;ADD PI CHANNEL MOVEM TAC,UNIT ;SAVE MOVE TEM,[JSR SRCH] ;SET UP INTERRUPT CELLS MOVEM TEM,DCLOC MOVE TEM,[JSR DTATHR] IFN CPBIT, < TLNN IOS,NOBUF ;DCLOC1 ALREADY SET UP IF DIRECT IO > MOVEM TEM,DCLOC1 ;FOR FORWARD DATA OPERATIONS CONSZ DTC,20000 ;IS TAPE ALREADY MOVING/ JRST FNDBL4 ;YES TRO TAC,323200 ;NO, SET READ BLK NOS., START DELAY TLNN IOS,RVERSE ;MOVE TAPE BACKWARDS? TRO TAC,10000 ;YES FNDBL3: IFN CPBIT, < PUSH PDP,IOS TLZ IOS,NOBUFC ;SET UP DIRCTN NON-0 IF DIRECT IO HLLZM IOS,DIRCTN POP PDP,IOS > MOVEM IOS,DEVIOS(DEVDAT) ;RESTORE IOS IN CORE POPJ PDP, ;AND EXIT ;HERE TO INITIATE READ OF A TAPE THAT IS MOVING ALREADY FNDBL4: CONSZ DTC,10000 ;GOING BACKWARDS? TRO TAC,10000 ;YES TRO TAC,320200 ;SET TO READ BLOCKS, NO DELAY JRST FNDBL3 ;GO TELL CONTROL ;INTERRUPT HERE TO READ A BLOCK NUMBER SRCH: 0 MOVEM TAC,TEMP ;SAVE TAC DATAI DC,TAC ;NO. READ A BLOCK NUMBER SUB TAC,BLOCK ;;PRESENT BLOCK - TARGET BLOCK IFN CPBIT, < SKIPE DIRCTN ;IF DIRECT IO CONSO DTC,10000 ;MUST READ DATA FORWARD > JUMPE TAC,FOUND ;THERE IS ZERO HRR TAC,UNIT ;NO. SET UP READ OF NEXT BLOCK CONSZ DTC,10000 ;GOING IN REVERSE TDC TAC,[XWD 400000,10000] ;YES, SWITCH TURN-AROUND TEST SKIPL TAC ;TURN AROUND? TRC TAC,12000 ;YES, SWITCH DIR., TUERN AROUND DELAY CONO DTC,320200(TAC);TELL CONTROL CONO DC,DCIN ;TELL DATA CONTROL ALSO SRCHXT: MOVE TAC,TEMP ;RESET TAAC JEN @SRCH ;AND EXIT THE INTERRUPT 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: JSR SHUTDN ;SHUT DOWN TAPE JRST DMPAV2 ;RESTORE TAC AND EXIT THE INTERRUPT > ;HERE WHEN CORRECT BLOCK NUMBER IS FOUND FOUND: CONSZ DTC,10000 ;GOING FORWARD? JRST IORVRS ;NO MOVE TAC,IOWD ;YES. SET BLKI/BLKO INOT PI LOC FND1: MOVEM TAC,DCLOC MOVE TAC,COMAND ;PICK UP READ OR WRITE COMMAND TRNE TAC,400 ;WRITE? CONO DC,DCOUT ;YES. CONDITION DATA CONTROL CONO DTC,360000(TAC) ;START DATA FLOW JRST SRCHXT ;AND LEAVE IORVRS: MOVEI TAC,10000 ;SET IO FOR REVERSE ORM TAC,COMAND MOVEI TAC,177 ADDM TAC,PNTR ;READ FROM TOP OF BUFFER DOWN MOVE TAC,[JSR RVERS] ;HAVE TO DO SOME STUFF AT INTERRUPT JRST FND1 ;INTERRUPT HERE FOR FLAG CHANNEL DTCINT: CONSO DTS,37 ;INTERRUPT FOR DECTAPE? JRST . ;NO, GO AWAY CONSO DTC,40000 ;YES. JOB DONE ENABLED? JRST BLKNUM ;NO. READING BLOCK NUMBERS CONSZ DTC,4000 ;YES. TIME FLAG ENABLED? JRST TIMINT ;YES. CHECK IF THIS IS A TIME INTERRUPT DTCIN1: CONO DC,0 ;NO. TURN OFF DATA CONTROL JSR DTCSAV ;SAVE ACS MOVE DEVDAT,USEWRD ;RESTORE DEVDAT MOVE IOS,DEVIOS(DEVDAT) ;AND IOS MOVE PROG,USEPRG CONSZ DTS,1 ;JOB DONE LIT? CONSZ DTS,116 ;AND NO ERORS? JRST ERRS ;NO. ERROR SKIPE ERRFLG ;DATA MISSED? JRST ERRS ;YES. TOO BAD ;DATA WAS READ IN OR WRITTEN OUT FINE DTCIN2: 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 ;DIRECTORY OPERATION? 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 AOSA BLK,IBLK(DEVDAT) ;READ SEQUENTIAL BLOCKS HRRM BLK,IBLK(DEVDAT) ;SAVE IN DDB TRNE IOS,IODTER+IODERR+IOIMPM ;WAS THERE AN INPUT ERROR? JRST THRUIN ;YES. DONT ADVANCE BUFFERS PUSHJ PDP,ADVBFF ;GET NEXT BUFFER JRST THRUIN ;EMPTY BUF NOT AVAILABLE 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,10000 TLO IOS,RVERSE ;HERE WHEN TAPE IS DONE THRUTP: CONSO DTC,20000 ;ON INTERRUPT LEVEL? JRST THRUTD ;NO. TAPE IS NOT MOVING MOVE TAC,UNIT ;SET TO STOP TAPE CONSZ DTC,10000 ;GOING REVERSE? TRO TAC,10000 ;YES CONO DTC,245000(TAC) ;STOP TAPE, WITH TIME FLAG INTERRUPT ON ;ENABLE JOB DONE AS A FLAG FOR DTCINT THRUTA: SOSL DCREQ ;GIVE UP DATA CONTROL (DECTAPE CONTROL SETOM DCAVAL ;WILL BE GIVEN UP AT NEXT INTERRUPT TLZ IOS,DMPMOD+NOBUF ;RESET DUMP-MODE BIT JRST CLRACT ;RESET IOACT AND RETURN THRUTD: PUSHJ PDP,THRUTA ;GIVE UP DATA CONTROL SOSL DTREQ ;GIVE UP DECTAPE CONTROL SETOM DTAVAL CONO DC,0 ;SHUT OFF DATA CONTROL CONO PI,DCOFF ;AN TURN OF ITS PI CHANNEL CONO DTC,0 ;SHUT DOWN DATA CONTROL HLLZS DTCINT POPJ PDP, ;AND LEAVE EXTERN CLOCK ;HERE ON END OF OUTPUT BLOCK OUTHRU: PUSHJ PDP,ADVBFE ;GET NEXT BUFFER JRST THRUTP ;NOT FULL JUMPE BLK,THRUTP ;DONE IF BLK=0 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 INTERUPT TURN: MOVEM TAC,TEMPA ;SAVE TAC MOVE TAC,UNIT ;UNIT AND CHANNEL CONSO DTC,10000 ;IN REVERSE? TRO TAC,10000 ;NO. NO WILL BE CONO DTC,322200(TAC);READ BLOCK NOS IN OPPOSITE DIRECTION MOVE TAC,TEMPA ;RESTORE TAC JEN @DTCCHL ;AND EXIT THE INTERRUPT TIMINT: CONSO DTS,20 ;TIME FLAG INTERRUPT ON? JRST SPRIUS ;NO. THIS IS A SPURIOUS INTERRUPT EXCH TAC,TIMREQ ;ANOTHER TAPE CAN NOT BE CONO PI,PIOFF ;SELECTED FOR 25 MSEC SO IDPB TAC,CLOCK ;PUT IN A CLOCK REQUEST CONO PI,PION ;TO WAIT FOR 3 TICKS EXCH TAC,TIMREQ ;BEFORE ALLOWING NEXT USER ON CONO DTC,0 ;SHUT DOWN DTC HLLZS DTCINT JEN @DTCCHL ;AND LEAVE ;HERE WITH AN INTERRUPT WHILE SEARCHING FOR BLOCK NUMBERS BLKNUM: CONSZ DTS,2 ;END ZONE INTERRUPT? JRST TURN ;YES. TURN AROUND CONSO DTS,14 ;NO. ILLEGAL OP OR PARITY ERROR? JRST DTCINT+1 ;NO. NOT REALLY A DECTAPE INTERRUPT JRST DTCIN1 ;YES. GO HANDLE ERROR ;HERE ON A SPURIOUS DECTAPE INTERRUPT SPRIUS: CONI DTC,TEMPA ;READ DTC STATUS BITS CONO DTC,@TEMPA ;GIVE A CONO TO DTC TO CLEAR INTERRUPT JEN @DTCCHL ;EXIT THE INTERRUPT TIMREQ: XWD .+1,3 ;E CLOCK TICKS SOSL DTREQ ;ALLOW OTHER JOBS SETOM DTAVAL ;TO GET DT CONTROL NOW POPJ PDP, ;COME HERE ON END OF DUMP MODE BLOCK SVDMTH: 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 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 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, < MOVE TAC1,SVPNTR ;YES. RESET POINTERS MOVEM TAC1,USPNTR MOVE TAC1,(TAC1) ;RESET PNTR ADD TAC1,ADRPRG MOVEM TAC1,PNTR > ERRS1: CONSO DTS,4 ;IF ILLEGAL OP - DONT RETRY CAILE TAC,DTTRY ;ENOUGH REREADS? SKIPA ;YES. PERMANENT ERROR JRST FNDBL2 ;NO. TRY AGAIN ;PERMANENT ERROR PERMER: CONSZ DTS,10 TRO IOS,IODTER ;PARITY CONSO DTS,100 SKIPE ERRFLG TRO IOS,IODERR ;MISSING DATA CONSZ DTS,4 NOBLK0: TRO IOS,IOIMPM ;ILLEGAL OP TLNE IOS,DMPMOD ;DUMP MODE? JRST DMPTHR ;YES. NOT THROUGH YET TLNN IOS,IO+RWDIR+SINGL ;READING DATA? JRST DTCIN2 ;YES. GIVE BUFFER TO USER TLZE IOS,IOW PUSHJ PDP,SETIOD ;OUT OF IO WAIT TLZN IOS,RWDIR+SINGL ;DIRECTORY OPERATION? JRST THRUTP ;NO. RETURN TO USER PUSHJ PDP,THRUTP ;YES. STOP TAPE MOVSI TAC,400000 ;CLEAR DIRECTORY IN CORE BIT ANDCAM TAC,DEVMOD(DEVDAT) BDDIR: LDB BLK,PJOBN ;NUMBER OF OFFENDING JOB JRST BADDIR ;GO PRINT ERROR MESSAGE BFPNTR: IOWD 200,BUF+1 ONEONE: XWD 1,1 USEWRD: 0 USEPRG: 0 PNTR: 0 TEMP: 0 TEMPA: 0 BLOCK: 0 QUANTM: 0 ERRCNT: 0 FNDTMP: 0 UNIT: 0 COMAND: 0 ERRFLG: 0 IFN CPBIT, < BLKCNT: 0 USPNTR: 0 SVPNTR: 0 ADRPRG: 0 DIRCTN: 0 > BUF: BLOCK 200 DTAEND: END