TITLE DTSER2 - EXECUTIVE SYSTEM DEC-TAPE SERVICE WITH STACKING SUBTTL L. HANTMANN 8-2-65 MULTIPLE DIRECTORIES VERSION DTSIZ=1 ;SUBROUTINE FOR DIRECTORY SEARCH ;PROG CONTAINS ACTUAL START OF PROGRAM ;DEVDAT CONTAINS ACTUAL START OF DVDB ;UUO CONTAINS RELATIVE ADDRESS OF DIRECTORY ENTRY IN USER AREA ;FORMAT PUSHJ PDP, UDIRSH ; JRST X ;RETURN IF EMPTY ENTRY FOUND ; NORMAL RETURN WHEN ENTRY IS FOUND INTERNAL ULOOK, UENTER EXTERNAL UXIT,PUUOAC,IOIERR,DIRERR,ADRCK,CPOPJ1,THSDAT UDIRLN=4 UDIRIN=100 ;DIRECTORY IN UDIREN=200 ;DIRECTORY ENTERED INTO UNWFRE=400 ;FREE BLCOK POINTER CHANGED ULINKF=1000 ;LAST OUTPUT BLOCK LINKED TO STORAGE UX1=TAC UX2=TAC1 UX3=DAT UDIRSH: TRNE UUO,777760 ;IS BLOCK IN UUO ACS? PUSHJ PDP,ADRCK ;NO. CHECK ADDRESS MOVEI TAC,3(UUO) TLNE IOS,IOBEG PUSHJ PDP, UBEG HRRZ UX1, PROG ;COPY ADR OF START OF PROGRAM ADDM UX1, UUO ;ACTUAL START OF DIR. IN USER MOVEI UX1,@UDIR(DEVDAT) ;ACTUAL POINTER TO DIRECTORY HRRZ UX2, 0(UX1) ;RELATIVE ADDR OF 1ST ENTRY I ;DIRECTORY HRLI UX1, -^D129+UDIRLN(UX2) ;ENTRY COUNTER ADDM UX2, UX1 ;START OF 1ST ENTRY IN DIRECT SKIPE UX2 CAILE UX2,174 ;IS THE REL ADR OF 1ST ENTRY INSIDE BUF JRST DIRERR ;NO UDIR2: SKIPN UX2, 0 (UX1) ;FIRST WORD OF ENTRY POPJ PDP, ;SPACES FOUND CAMN UX2, 0(UUO) ;CHECK IF = TO USER AREA JRST UDIR4 ;CHECK 2ND WORD UDIR3: ADD UX1, UDIRK1 JUMPL UX1, UDIR2 POP PDP, UX1 ;TAKE PREVIOUS EXIT FROM TABL JRST UXIT ;TABLE FULL UDIR4: HLRZ UX2, 1 (UUO) ;2ND WORD IN USER ARE JUMPE UX2, CPOPJ1 HLRZ UX3, 1 (UX1) ;2ND WORD OF DIRECTORY AREA CAIE UX3, 0 (UX2) JRST UDIR3 ;CHECK MORE ENTRIES JRST CPOPJ1 ;MATCH, SKIP RETURN UDIRK1: XWD UDIRLN, UDIRLN ;SUBROUTINE FOR DIRECTORY LOOKUP ;FORMAT PUSHJ PDP, UDIRLU ;VIA UUO ; JRST X ;ENTRY NOT IN TABLE ULOOK: PUSHJ PDP, UDIRSH JRST UXIT HRR UX3, 1 (UX1) HRLM UX3, DEVIAD (DEVDAT) ULOOK1: HRLI UX2, 0 (UX1) ;FROM DIRECTORY HRRI UX2, 0 (UUO) ;TO USER BLT UX2, UDIRLN-1(UUO) LDB UX2,[POINT 12,2(UX1),35] ;GET DATE USER(ENTER)EXEC(LOO JUMPN UX2,.+3 ;IS IT 0? MOVE UX2,THSDAT ;YES, USE CURRENT DATE DPB UX2,[POINT 12,2(UUO),35] ;SET EXEC AOS (PDP) JRST UTWDR ;SUBROUTINE TO ENTER NEW OR CHANGE OLD DIRECTORY ENTRY ;FORMAT PUSHJ PDP, UDIRCH ; JRST X ;NO ROOM IN TABLE UENTER: PUSHJ PDP, UDIRSH JRST .+1 AOS UX3, UFREE (DEVDAT) HRRM UX3,1(UUO) HRLM UX3, DEVOAD (DEVDAT) EXCH UX1, UUO TLO IOS, UDIREN+UNWFRE+ULINKF MOVEM IOS, DEVIOS(DEVDAT) JRST ULOOK1 ;CREATE A CLEAN TAPE AND DIRECTORY INTERNAL UTPCLR EXTERNAL USRJDA UTPCLR: LDB TAC,PUUOAC MOVE DEVDAT,USRJDA(TAC) JUMPE DEVDAT,IOIERR HLRZ TAC,DEVNAM(DEVDAT) CAIE TAC,446441 JRST UXIT ;NOT DTA MOVE IOS,DEVIOS(DEVDAT) TLZ IOS,IOBEG TLO IOS,UDIRIN+UDIREN+UNWFRE IFE DTSIZ,< MOVEM DEVDAT,DIREC> ;THIS FOR SINGLE DIRECTORY ONLY MOVE TAC,UDIR(DEVDAT) MOVE TAC1,[XWD 1,5] MOVEM TAC1,(TAC) HRLS TAC AOBJN TAC,.+1 SETZM (TAC) MOVE TAC1,TAC AOS TAC BLT TAC,176(TAC1) MOVEI TAC, 1 MOVEM TAC, UFREE (DEVDAT) MOVEM IOS, DEVIOS(DEVDAT) PUSHJ PDP,UTPREL JRST UXIT ;END OF DTDR SUBTTL L. HANTMAN PART 1 7-13-65 UREV=10000 ;DT REVERSE BIT DTSIZ=1 ;1 FOR ONE BUFFER PER TAPE UNIT UBLK=1 ;NUMBER OF BLOCKS/BLOCK UCHN=1 ;CHANNEL OF DATA CONTROL = 1, LOC 42 UCHA=42 ;DATA CONTROL INTERRUPT POSITION EXTERNAL UXIT,ADVBFF,ADVBFE,IOSET,OUT,WAIT1,WSYNC EXTERNAL PIOMOD,PUNIT,UFREE,UDIR,ADRERR,JOBPFI ENTRY UTDSP DACI=4010 ;DC INPUT DT DACO=3410 ;DC OUTPUT DT SL=220000 ;DT TURN ON. SELECT DTR=3000 ;DT TURN AROUND DELAY DT=2000 ;DT START/STOP DELAY RD=300 ;DT RD WD=700 ;DT WR RB=200 ;DT READ BLOCK NOS. VEOT=2 ;EOT FLAG BIT GR=10000 ;DT REVERSE BIT JDE=40000 ;JOB DONE ENABLE EE=100000 ;ENABLE END FLAG URDIR=2000 ;READING DIRECTORY UTDSP: JRST UTPREL ;RELEASE JRST UTPCLS ;CLOSE JRST UOUT ;OUTPUT JRST UIN ;INPUT JRST UENTER ;ENTER IN DIRECTORY JRST ULOOK ;LOOKUP IN DIRECTORY JRST UDMPO ;DUMPOUT JRST UDMPI ;DUMPIN JRST SETO ;SET OUTPUT BLOCK NO. JRST SETI ;SET INPUT BLOCK NO. JRST GETF ;GET FREE BLOCK UOUT: PUSHJ PDP, UINTER ;CHECK INTERLOCK TLO IOS, IO ;WRITING HRRZ TAC,DEVOAD(DEVDAT) ADD TAC, PROG ;ACTUAL BUFFER ADDRESS HLRZ TAC1, DEVOAD(DEVDAT) ;BLOCK TO WRITE CAIN TAC1,1 JRST UOUT4 ;COPY DIRECTORY HLRZ TAC1, 1(TAC) ;BLOCK TIE TLZ IOS, ULINKF ;NOT LINKED TO FREE STORAGE JUMPN TAC1, UOUT1 ;USE BALOCK NUMBER INDICATED TLZE IOS, IOBEG ;GET FREE STORAGE BLOCK PUSHJ PDP, UBEG3 TLO IOS,UNWFRE+ULINKF ;LINKED TO FREE STORAGE MOVEM IOS, DEVIOS (DEVDAT) AOS TAC1,UFREE(DEVDAT) ;NEXT FREE BLOCK UOUT1: CAIN TAC1,1 ;IF 1, THIS IS LAST BLOCK SETZ TAC1, ;LAST BLOCK TIE = 0 HRLM TAC1,1(TAC) ;BLOCK HRRZM TAC,UBUF ;ACTUAL LOCATION OF DATA HLR TAC,DEVOAD(DEVDAT) HRLM TAC1, DEVOAD(DEVDAT) ;NEXT BLOCK JRST USETW ;RETURN FROM WRITING 1 BLOCK UOUT2: MOVE TAC,DEVOAD(DEVDAT) HRLI TAC,PROG ;PROG, BUFFER ADDRESS HRLZI TAC1,IOUSE ANDCAM TAC1,@TAC ;SET USE BIT IN BUFFER HLRZ TAC1,DEVOAD(DEVDAT) ;BLOCK TIE JUMPE TAC1,UOUT3 ;WAS BLOCK WRITTEN THE LAST 0 HRR TAC,@TAC ;PROG, NEXT BUFFER ADDRESS HRRM TAC,DEVOAD(DEVDAT) ;NEXT BUFFER TRNE IOS, IOCON ;CONTINUOUS? JRST UOUT3 ;STOP TAPE AND DISMISS SKIPGE @TAC ;IS NEXT BUFFER EMPTY? JRST UOUT+1 ;PROCESS NEXT BLOCK UOUT3: POP PDP, TAC ;REDUCE TABLE JRST DTC1 ;STOP TAPE AND DISMISS ;COPY DIRECTORY WHEN WRITING BLOCK 1 UOUT4: HRLI TAC1,1(TAC) ;BUFFER ADDRESS, FROM HRR TAC1, UDIR(DEVDAT) ;DIRECTORY ADDRESS, TO HRRZ TAC, UDIR(DEVDAT) ;DIRECTORY ADDRESS BLT TAC1, 177(TAC) ;MORE BUFFER AREA TO DIRECTORY TLO IOS, UDIRIN+UDIREN ;SET DIRECTORY BITS MOVE TAC1, @UDIR(DEVDAT) ;NEXT FREE BLOCK IN DIRECTORY HLRZM TAC1,UFREE(DEVDAT) ;PLACE IN DATA BLOCK HRLZI TAC1, IOUSE ANDCAB TAC1, 0(TAC) ;CLEAR USE BIT HRRM TAC1, DEVOAD(DEVDAT) ;ADVANCE BUFFER POINTER JRST UEND2 ,INPUT- NON DUMP UIN: PUSHJ PDP, UINTER ;CHECK INTERLOCK TLZ IOS, IO ;READING HRRZ TAC,DEVIAD(DEVDAT) ;UBUF:=TAC:=DEVIAD+PROG ADD TAC,PROG HLRZ TAC1, DEVIAD(DEVDAT) ;BLOCK TO READ CAIN TAC1, 1 ;TRYING TO READ DIRECTORY? JRST UIN2 ;COPY DIRECTORY HRRZM TAC,UBUF HLRZ TAC,DEVIAD(DEVDAT) ;TAC:=C(DEVIAD LH) JUMPE TAC,UEND ;NEXT BLOCK=00, THEN END OF FI JRST USETR ;RETURN FROM READING ONE BLOCK UIN1: HRRZ TAC,DEVIAD(DEVDAT) ADD TAC,PROG HLRZ TAC1,1(TAC) HLRM TAC1,DEVIAD(DEVDAT) ;NEXT BLOCK NUMBER TO READ MOVE TAC,DEVIAD(DEVDAT) HRLI TAC,PROG HRLZI TAC1,IOUSE IORM TAC1,@TAC ;SET USE BIT HRR TAC,@TAC HRRM TAC,DEVIAD(DEVDAT) ;NEXT BUFFER ADDRESS TRNE IOS, IOCON ;CONTINUOUS? JRST UOUT3 ;EXIT SKIPL @TAC ;IS NEXT BUFFER FULL JRST UIN+1 ;PROCESS NEXT BLOCK JRST UOUT3 ;EXIT UEND: TLO IOS, IOEND MOVEM IOS, DEVIOS(DEVDAT) CONSZ UTC, 20000 ;IS TAPE STOPPED? JRST UOUT3 ;STOP TAPE AND EXIT UEND2: SOSL DCREQ ;DECREMENT REQUEST COUNT, IS ANY ONE WA SETOM DCAVAL ;YES,SET DATA CONTROL AVAILABLE SOSL DTREQ ;DECREMENT REQUEST COUNT, IS ANY ONE WA SETOM DTAVAL ;YES,SET DECTAPE CONTROL AVAI TRZ IOS, IOACT ;CLEAR ACTIVE BIT MOVEM IOS, DEVIOS(DEVDAT) ;RESTORE STATUS BITS POPJ PDP, 0 ;EXIT ;COPY DIRECTORY WHEN READING BLOCK 1 UIN2: TLZE IOS, IOBEG ;IS DIRECTORY IN JRST UIN4 ;READ IN DIRECTORY PUSHJ PDP, UEND2 ;CLR INDICATORS UIN3: MOVE TAC1,UFREE(DEVDAT) ;NEXT FREE BLOCK IN DATA BLOC HRLM TAC1, @UDIR(DEVDAT) ;PLACE IN DIRECTORY HRRI TAC1, 1(TAC) ;BUFFER ADDRESS, TO HRL TAC1, UDIR(DEVDAT) ;DIRECTORY ADDRESS, TO BLT TAC1, 200 (TAC) ;MOVE DIRECTORY TO BUFFER ARE HRLZI TAC1, IOUSE IORB TAC1, IOUSE ;SET USE BIT HRRM TAC1,DEVIAD(DEVDAT) ;ADVANCE BUFFER POPJ PDP, 0 ;EXIT UIN4: PUSHJ PDP, UBEG3 JRST UIN3 SETI: PUSHJ PDP,WAIT1 HRLM UUO,DEVIAD(DEVDAT) ;SET INPUT BLOCK NO. JRST UXIT SETO: PUSHJ PDP,WAIT1 PUSHJ PDP, UINTER ;WAIT FOR USE TO STOP PUSHJ PDP, UEND2 ;CLEAR INDICATORS HRLM UUO,DEVOAD(DEVDAT) ;SET OUTPUT BLOCK NO. JRST UXIT GETF: PUSHJ PDP,WAIT1 TLNE IOS,IOBEG PUSHJ PDP,UBEG TLO IOS,UNWFRE MOVEM IOS,DEVIOS(DEVDAT) AOS TAC, UFREE(DEVDAT) ;GET FREE BLOCK HRLM TAC, DEVOAD(DEVDAT) HRLI UUO,PROG HRRM TAC,@UUO JRST UXIT INTERNAL UTPCLS,UTWDR,UBEG,UTPREL UTWDR: IFE DTSIZ,< PUSHJ PDP,UTPREL> JRST UXIT UTPCLS: TLNN IOS, ULINKF JRST UTPREL LDB TAC,PIOMOD ;MODE CAIL TAC,16 JRST UTPREL HLR TAC,DEVBUF(DEVDAT) HLRI TAC, PROG HRR TAC, @TAC ;TAC:=BUFFER ADDRESS ADDI TAC,1 MOVEI TAC1,1 HRLM TAC1,@TAC JRST OUT UTPREL: IFE DTSIZ,< TLNE IOS,IOBEG ;RELEASE POPJ PDP, TLZE IOS,UDIREN JRST UTPRL1 TLNN IOS,UNWFRE POPJ PDP, TLNN IOS,UDIRIN PUSHJ PDP,UBEG> IFN DTSIZ,< TLZN IOS,UDIREN+UNWFRE POPJ PDP,> UTPRL1: PUSHJ PDP,UINTER ;IS SYSTEM AVAILABLE? HRR TAC,UFREE(DEVDAT) HRLM TAC,@UDIR(DEVDAT) MOVE TAC,UDIR(DEVDAT) SUBI TAC,1 MOVEM TAC,UBUF TLO IOS, URDIR MOVEM IOS,DEVIOS(DEVDAT) MOVEI TAC,1 PUSHJ PDP,USETW JRST WAIT1 ,READ THE DIRECTORY FROM THIS DEC-TAPE UBEG: SKIPGE DEVMOD(DEVDAT) ;IS DIRECTORY IN CORE? TLO IOS,UDIRIN TLNE IOS,UDIRIN POPJ PDP, 0 PUSHJ PDP, UINTER ;CHECK INTERLOCK UBEG2: PUSH PDP, TAC ;SAVE TAC HRRZ TAC,UDIR(DEVDAT) SUBI TAC, 1 MOVEM TAC,UBUF TLO IOS,UDIRIN+URDIR TLZ IOS, IOBEG MOVEM IOS,DEVIOS(DEVDAT) MOVSI TAC,DVDIRIN ;SET DIRECTORY IN CORE BIT IORM TAC,DEVMOD(DEVDAT) MOVEI TAC,1 PUSHJ PDP,USETR PUSHJ PDP,WSYNC HLR TAC,@UDIR(DEVDAT) HRRZM TAC,UFREE(DEVDAT) UBEGX: POP PDP,TAC POPJ PDP, 0 UBEG3: TLNE IOS, UDIRIN POPJ PDP, 0 JRST UBEG2 UTBERR: PUSHJ PDP, DTC1 ;ILL. BLOCK NO. JRST UTBKER USETW: MOVEI TAC1, RIT SKIPA USETR: MOVEI TAC1,READ HRRM TAC1,DDIG HRRZM TAC,UBKN JUMPLE TAC,UTBERR ;ILL. BLOCK NO.? CAIL TAC,1102 JRST UTBERR ;ILL. BLOCK NO. LDB TAC,PUNIT ;UNIT ROT TAC, 3 ADDI TAC, DTCCHN ;DECTAPE CHANNEL MOVEM TAC, UNIT ;UNIT AND CHANNEL MOVEI TAC, 137 HRRM TAC, DTCINT SUBI TAC, 21 HRRM TAC, CONSZ1 ;FALL INTO FILL FILL: CONO DC,0 ;DESELECT DC CONO PI,2100 ;TURN ON CHANNEL 1 MOVEM DEVDAT, USVDB ;SAVE DATA BLOCK ADDR MOVEM DEVDAT,UDVDAT ;UDVDAT:=DTJIOS POINTER MOVEI TAC, DEVIOS ADDM TAC,UDVDAT MOVE TAC, [JSR DDIF] ;DATA CONTROL INTERRUPT CHANN MOVEM TAC,UCHA MOVEM PROG,UPROG ;UPROG:=PROG MOVE TAC,UBUF ;BLI:=XWD-200,C(UBUF) HRLI TAC,-200 MOVEM TAC,BLI ADDI TAC,200-1 MOVEM TAC,BLO CONSZ UTC, 20000 ;IS TAPE MOVING? JRST FILLC ;YES MOVE TAC, UNIT ;RDDA:=RDRM:=WTDA:=WTRM:=C(UN DPB TAC,F1 DPB TAC,F2 DPB TAC,F3 DPB TAC,F4 MOVE TAC,UNIT ANDI TAC, 70 ;TAC HAS UNIT ONLY ADDI TAC, SL+DTR+RB+EE+UCHN TLNN IOS, UREV ;WAS REV, GO FWD ADDI TAC,GR ;WAS FWD, GO REV CONO UTC, @TAC FILL2: CONO DC, DACI+UCHN ;SET UP DC FOR INPUT MOVEM IOS, DEVIOS (DEVDAT) POPJ PDP, ,TAPE IS ACTIVE - GIVE A COMMAND FILLC: CONI UTC,TAC ;UTC COMMAND: UNIT, OLD DIRE ANDI TAC,GR+70 ;DIRECTION PLUS UNIT CONO UTC,SL+RB+EE+UCHN(TAC) ;NO TIME DELAY JRST FILL2 F1: POINT 6,RDDA,35 F2: POINT 6,RDRM,35 F3: POINT 6,WTDA,35 F4: POINT 6,WTRM,35 ,CHANGE DIRECTIONS - GIVE NEW COMMANDS RRV: CONI UTC,TAC XORI TAC,GR ;REVERSE BIT ANDI TAC,550777 IORI TAC,DT CONO UTC,SL(TAC) CONO DC,DACI+UCHN JRST DXIT ,EXAMINE BLOCK NUMBERS - DISPATCHED FROM INTERRUPT - CHAN, DC. DDIF: 0 ;GOING FORWARD MOVEM TAC,SV1 ;SV1:=TAC CONSZ UTS, VEOT JRST RRV DATAI DC,TAC CAMN TAC,UBKN ;BLK NOT =STR DDIG: JRST . ;JRST READ, BIT, IFRIGHT UBK CONSZ UTC,10000 ;GOING BACKWARDS JRST .+4 ;BACKWARDS CAML TAC,UBKN ;BLK > STR > FORWARD JRST RRV JRST .+3 CAMG TAC,UBKN ;BACKWARDS JRST RRV ;BACKWARDS DDIG2: CONI UTC,TAC ANDI TAC,550777 CONO UTC,SL(TAC) SKIPA DXIT1: HRRM TAC,UCHA DXIT: MOVE TAC,SV1 ;RESTORE TAC JEN @DDIF ;RE-ENABLE, DISMISS. ,DISPATCH FROM UCHA INITIALLY ON CORRECT BLOCK MARK ,SETS OP TO READ, WRITE IN FWD, REVERSE ;RD FORWARD RDDA: CONO UTC,SL+RD+JDE+EE ;GETS UNIT NO. - RE MOVEI TAC,RDFW CONO DC,DACI+UCHN JRST DXIT1 WTDA: CONO UTC,SL+WD+JDE+EE ;GETS UNIT NO. - RE MOVEI TAC,WTFW CONO DC,DACO+UCHN JRST DXIT1 READ: CONSO UTC,10000 ;ENTRY TO SET UP READ JRST, RDDA ;READ REVERSE RDRM: CONO UTC,SL+GR+RD+JDE+EE ;GETS UNIT NO. - RESETS TO RD MOVEI TAC,RDRV CONO DC,DACI+UCHN JRST DXIT1 RIT: CONSO UTC,10000 ;GOING REVERSE - ENTRY TO SET JRST WTDA ;WRITE FORWARD ;WRITE REVERSE WTRM: CONO UTC,SL+WD+GR+JDE+EE ;GETS UNIT NO. -RESETS. TO WT MOVEI TAC,WTRV CONO DC,DACO+UCHN JRST DXIT1 ,DC INTERRUPT PROCESSSING TO READ/WRITE DATA IN EITHER ,DIRECTION, AND RE-ENABLE INTERRUP. ,EXIT BLOCK PROCESSING AT ENPT(WRITE), ENPTI(READ) RDRV: 0 ;ENTRY VIA UCHA - READ REV BLKI DC,BLO JSR ENPTI SOS BLO SOS BLO JEN @RDRV RDFW: 0 ;ENTRY VIA UCHA - READ FWD BLKI DC,BLI JSR ENPTI JEN @RDFW WTRV: 0 ;ENTRY VIA UCHA - WRITE REV BLKO DC,BLO JSR ENPT SOS BLO SOS BLO JEN @WTRV WTFW: 0 ;ENTRY VIA UCHA - WRITE FWD BLKO DC,BLI JSR ENPT JEN @WTFW ;END OF OUTPUT BLOCK ENPT: 0 JSR, ENP ENPT2: MOVEM TAC,SV1 ;SV1:=TAC HRLZI TAC,UREV CONSZ UTC,10000 ANDCAM TAC,@UDVDAT CONSO UTC,10000 IORM TAC,@UDVDAT MOVEI TAC,UOFF HRRM TAC,UCHA MOVE TAC,SV1 JRSTF @ENPT ,CHECK ERROR BITS DC MISSED, 0T PARITY, 1 LEG OP, TAPE END ENP: 0 CONSZ DC, 10000; DATA MISSED JSR ERROR2 JRSTF @ENP ,SAVE STATE OF UTS, UTC, DC, TURN OFF DC, UTC, +1@ERRTAL,+1@UERR ;ERROR LOOPS ERROR: 0 CONI UTS, C12 CONI UTC, C13 CONI DC, C11 SETOM ERRFLG JRSTF @ERROR ;INTERRUPT FROM DATA FLAG AFER BLKO HAS COUNTED OUT UOFF: 0 CONO PI, 1100 ;TURN DC CHANNEL OFF JEN @UOFF ;DISMISS EXTRA WRITE FLAG ;END OF INPUT BLOCK ENPTI: 0 EXCH TAC, ENPTI MOVEM TAC, ENPT JSR ENP CONO DC, 0 MOVE TAC, ENPTI JRST ENPT2 ;DETECT FIRST ERROR ONLY ERROR2: 0 SKIPN ERRFLG ;PREVIOUSLY DETECTED ERROR! JSR ERROR ;STORE ERROR CONDITIONS JRSTF @ERROR2 ;CONTINUE LOOP ;END OF PART 1 DTSER2 EXTERNAL SETIOD INTERNAL UDMP0, UDMPI ; DUMP OUT UDMPO: TLO IOS, IO ;SET FOR OUTPUT PUSHJ PDP, UINTER ;CHECK INTERLOCK TRNN UUO, 777777 ;COMMAND ADDRESS? JRST UDMP2-1 ;ERROR MOVEI TAC, DDUMP ;RETURN WHEN BLOCK FOUND UDMP0: MOVE TAC1, [JSR DMPADV] ;BLKI OR BLKO RETURN, COMMANDS ;COMMON ROUTINE FOR ALL DUMP MODES, START SEARCH UDMP1: HRRM TAC,DDIG ;SEARCH RETURN MOVEM TAC1, UCHA+1 ;INTERRUPT RETURN MOVE TAC, [JSR DDIF] MOVEM TAC, UCHA ;DATA CONTROL CHANNEL HLRZ TAC, DEVOAD (DEVDAT) ;BLOCK NUMBER TLNN IOS, IO ;WRITING? HLRZ TAC, DEVIAD(DEVDAT) ;INPUT BLOCK NUMBER MOVEM TAC, UBKN ;BLOCK TO LOOK FOR HRRZM DEVDAT, USVDB ;DATA BLOCK ADDRESS LDB TAC,PUNIT ;UNIT ROT TAC, 3 ADDI TAC, DTCCHN MOVEM TAC, UNIT ;UNIT AND DT CHANNEL ANDI TAC, 70 CONO UTC, SL+DTR+RB+EE+UCHN(TAC) SETOM UERRCN ;SET ERROR COUNTER MOVEI TAC, 37 ;DO NOT CHECK FOR INCOMPLETE HRRM TAC, DTCINT MOVEI TAC,16 HRRM TAC, DTCINT+4 CONO DC, DACI+UCHN ;SET DATA CONTROL CONO PI,2100 ;INSURE CHANNEL 1 ON HRRZM PROG, UDMPA ;SAVE PROGRAM TRNN UUO, 777777 ;COMMAND ADDRESS POPJ PDP, 0 ;COMMAND LIST ON TAPE, INPUT HRRZ TAC, UUO ;GET CMD PNTR HRRZ TAC1, TAC ;SAVE POINTER UDMP1A: ADD TAC1, PROG ;GET ACTUAL POINTER HRRZM TAC1, UDMP ;STORE WORKING POINTER ;CHECK ENTIRE COMMAND LIST FOR VALIDITY UDMP1B: SKIPN TAC1, @UDMP ;GET COMMAND JRST UDMP1C ;END OF COMMAND LIST JUMPG TAC1, UDMP1A ;CHANGE COMMAND SEQUENCE HLREM TAC1, SVCNTR ;SAVE -N HRRZS TAC1 ;GET ADDRESS CAIGE TAC1, JOBPFI ;IS IT ABOVE IO PROT. AREA JRST ADRERR ;NO. ADDRESS CHECK ERROR SUB TAC1, SVCNTR ;GET AREA END CAMLE TAC1, USRREL ;LESS THEN END? JRST UDMP2-1 ;OUT OF BOUNDS AOS UDMP ;INDEX COMMAND LIST POINTER JRST UDMP1B ;GET NEXT COMMAND ;GET FIRST COMMAND UDMP1C: ADD TAC, PROG ;GET ACTUAL ADDRESS HRRZM TAC, UDMP ;SAVE POINTER SKIPN TAC, @UDMP ;1ST COMMAND JRST UDMP2 ;NOTHING TO DO ADD TAC, PROG ;ACTUAL POINTER JUMPGE TAC, .-4 ;CHANGE COMMAND SEQUENCE MOVEM TAC, BLO ;SAVE I/O POINTER POPJ PDP, 0 ;EXIT WITH ERROR TRO IOS, IOBKTL UDMP2: MOVEI TAC, -3 HRREM TAC, UERRCN SETZM ERRFLG JRST UEND2 ;SEARCH RETURN,OUTPUT,COMMAND LIST IN MEMORY DDUMP: CONSZ UTC,GR JRST DDIG2 ;KEEP GOING MOVE TAC,[BLKO DC,BLO] MOVEM TAC, UCHA CONO DC,DACO+UCHN MOVE TAC,UNIT CONO UTC,SL+WD+JDE+EE(TAC) JRST DXIT ;BLKI OR BLKO RETURNS, COMMAND LIST IN MEMORY DMPADV: 0 MOVEM TAC,SV1 AOSA TAC,UDMP ;POINTER DMPA1: HRRZM TAC, UDMP ;STORE POINTER SKIPN TAC, 0(TAC) ;IS WORD ZERO JRST DMPA2 ;END ADD TAC, UDMPA ;ADD PROGRAM JUMPGE TAC, DMPA1 ;CHANGE COMMAND MOVEM TAC, BLO DMPXT: MOVE TAC, SV1 JEN @DMPADV ;END OF COMMAND LIST, INPUT OR OUTPUT DMPA2: JSR ENP CONO PI, 1100 ;TURN DATA CONTROL CHANNEL OF CONSO UTS, 40 ;WRITING? CONO DC, 0 ;SHUT OFF DATA CONTROL JRST DMPXT ;SEARCH RETURN, INPUT COMMAND LIST ON TAPE DDMPI: CONSZ UTC, GR ;GOING BACKWARDS? JRST DDIG2 ;KEEP GOING MOVE TAC, [XWD -1,BLO-1] MOVEM TAC, BLO ;COMMON INSTRUCTIONS FOR COMMAND LIST IN MEMORY OR ON TAPE DDMPI2: MOVE TAC, [BLKI DC,BLO] MOVEM TAC, UCHA CONO DC, DACI+UCHN MOVE TAC, UNIT CONO UTC, SL+RD+JDE+EE(TAC) JRST DXIT ;INPUT COMMAND LIST ON TAPE. BLKI RETURN AFTER READING COMMAND DMPRD: 0 SKIPL BLO ;END OF COMMAND LIST? JRST DMPRD1 MOVEM TAC, SV1 ;SAVE TAC MOVE TAC, BLO ;PICK UP COMMAND HLREM TAC, SVCNTR ;-N HRRZS TAC ;ADDRESS SUB TAC, SVCNTR ;END ADDRESS DMPRD0: CAILE TAC, 0 ;