;TENDMP.10X;6 10-AUG-73 13:11:20 EDIT BY CLEMENTS ;TENDMP.10X;5 10-AUG-73 13:03:12 EDIT BY CLEMENTS ;TENDMP.10X;4 19-JUL-73 18:27:37 EDIT BY CLEMENTS ;TENDMP.10X;3 7-JUL-73 18:37:15 EDIT BY CLEMENTS TITLE TENDMP - FOR THE TENEX BOOTSTRAP PROCESS - R CLEMENTS 2 JUL 73 ;"THESE BOOTS WERE MADE FOR WALKIN'." - N.S. ;AC'S F=0 ;FLAGS A=1 ;GENERAL AC'S B=2 ; .. C=3 ; .. X=4 ;MEMORY ADDRESS COUNTER W=5 ;WORD RETURNED BY RWORD OR SIXBRD NAME=6 ;NAME OF FILE BEING SEARCHED FOR EXT=7 ;EXTENSION OF FILE BEING SEARCHED FOR Q=10 ;COUNTER TO STEP THROUGH BUFFER OF 200 DATA WORDS N=12 ;NUMBER ASSEMBLER IN TYPEIN, COUNTER IN SEARCH,RDBLK,WRBLK M=13 ;MEMORY AOBJN POINTER FOR READING THE DATA TO CORE FN=14 ;FILE NUMBER, 1 TO NFILES BP=15 ;POINTER TO CURRENT DIR BYTE (ALSO SIXBIT INPUT) LBN=16 ;TAPE BLOCK NUMBER TO READ P=17 ;STACK POINTER PDLL==20 ;STACK LENGTH OPDEF PJRST [JRST] INTERN BGTEND,LWTEND,ENDTND,TENDMP BGTEND: PHASE 377000 LWTEND: ;I/O DEVICE PARAMETERS DTC==320 ;DEVICE CODE FOR DTA CONTROL DTS==324 ;DEVICE CODE FOR DTA STATUS O.NOP==0 ;OPCODES FOR THE DTA CONTROL CONO O.SRCH==200 ;SEARCH O.READ==300 ;READ O.WRIT==700 ;WRITE C.STOP==400000 ;CONO BITS C.FWD==200000 ;GO FORWARD C.REV==100000 ;GO REVERSE C.NDEL==040000 ;NO DELAY AFTER CONO C.SEL==020000 ;SELECT A UNIT C.DSEL==010000 ;DESELECT CURRENT UNIT S.DAT==1 ;DATA DONE FLAG S.INT==2 ;INT REQ FLAG S.END==020000 ;END ZONE HIT S.JOBD==100000 ;JOB DONE FLAG S.ERR==653300 ;ERRORS TO GIVE UP ON. ;FLAGS, LEFT HALF OF F L.REV==400000 ;TAPE MOVING IN REVERSE. SIGN BIT REQ? L.REVA==40 ;ALLOCATION PASS IS GOING IN REVERSE L.TURN==100 ;ALLOCATION PASS HAD TO TURN AROUND ;FLAGS, RIGHT HALF OF F R.WEOF==2 ;ON WHILE WRITING JRST WORD(S) IN LAST BLK R.DIRI==4 ;DIRECTORY IN CORE IS VALID ;SYSTEM PARAMETERS WHICH MUST AGREE WITH TIMESHARING SYSTEM DIRBLK==144 ;WHERE DIRECTORY IS ON TAPE D.BYT==0 ;WORD OF BYTES IN DIRECTORY D.NAM==123 ;FIRST NAME IN DIRECTORY D.EXT==151 ;START OF EXTENSIONS IN DIR NFILES==26 ;HOW MANY FILES FIT IN DIR MAXBLK==1101 ;LAST BLOCK ON THE TAPE BLKFAC==2 ;BLOCKING FACTOR - WRITE ONE OF N BLKS ;START HERE TENDMP: 0 ;CALLED BY JSR FROM SWPMON GO: MOVEI F,0 ;CLEAR ALL FLAGS MOVE P,PDP ;INITIAL STACK POINTER PUSHJ P,RDDIR ;GET TAPE DIRECTORY LOAD: MOVSI FN,-NFILES ;SEARCH TO SEE IF ONLY ONE SAV FILE ON DT MOVEI A,0 ;WHERE NAME WILL GO IF FOUND RUN5: HLRZ EXT,HBUF+D.EXT(FN) ;CHECK AN EXTENSION MOVE NAME,HBUF+D.NAM(FN) ;AND FILE NAME CAIN EXT,(SIXBIT /SWP/) ;IS IT THE .SWP FILE? CAME NAME,SYSTEM ;REAL NAME OF FILE ('TENEX') RUN4: AOBJN FN,RUN5 ;LOOP THRU COUNTING ALL FILES MOVEI FN,1(FN) ;FROM AOBJN CTR TO FILE NUMBER MOVEI LBN,1 ;HAVE TO FIND A BLOCK OF FILE MOVE BP,BYTPTR ;LOOK THRU DIRECTORY RUNL: ILDB N,BP ;GET A BYTE CAIN N,0(FN) ;BELONG TO THIS FILE? JRST RUN1 ;YES. CAIL LBN,MAXBLK ;LOOKED TOO FAR? PUSHJ P,ERROR ;YES. NO BLKS IN FILE! AOJA LBN,RUNL ;LOOK FURTHER RUN1: PUSHJ P,RDDAT1 ;READ THE DATA BLOCK TO FIND FBN LDB A,[POINT 10,DBUF+0,27] ;FIRST BLOCK OF FILE HRLM A,DBUF+0 ;PUT IT IN LINK SLOT TO BE READ NEXT RFILE: SETZB Q,40 ;CLEAR CORE BEFORE READING FILE ;AND INITIALLY NO WORDS IN DATA BUFFER RFILL1: PUSHJ P,RWORD ;READ A POINTER OR JRST WORD SKIPL M,W ;WHICH IS IT? JRST STARTQ ;TRANSFER WORD RFILL2: PUSHJ P,RWORD ;READ A WORD OF DATA MOVEM W,1(M) ;STORE IT IN CORE AOBJN M,RFILL2 ;COUNT THE CORE POINTER. JRST RFILL1 ;IT RAN OUT. GET ANOTHER. STARTQ: CONO DTC,C.STOP ;STOP THE TAPE JRST @TENDMP ;RETURN TO SWPMON. ;SUBROUTINE TO READ A DATA WORD FROM THE FILE. RWORD1: MOVE Q,DBUFP ;PREPARE TO COUNT DATA WORDS RWORD: JUMPGE Q,RWNXTB ;NEED ANOTHER BLOCK? MOVE W,0(Q) ;NO. GET A WORD. AOBJN Q,.+1 ;COUNT IT. POPJ P,0 ;RETURN FROM RWORD RWNXTB: PUSHJ P,RDDATA ;NO. READ NEXT DATA BLOCK, IF ANY JRST RWORD1 ;READ FROM THIS BLOCK ;SUBROUTINE TO READ NEXT BLOCK OF DATA INTO DBUF RDDATA: HLRZ LBN,DBUF+0 ;LINK JUMPE LBN,ERROR ;JUMP IF END OF FILE RDDAT1: MOVEI A,DBUF ;SELECT DATA BUFFER RDBLK: PUSHJ P,PROCBK ;PROCESS A BLOCK CONO DTC,O.READ ;ARGS TO PROCBK DATAI DTC,0(A) ; TO CAUSE IT TO READ THE BLOCK POPJ P,0 ;SUCCESS. RETURN RDDIR: TRNE F,R.DIRI ;IS THE DIRECTORY IN CORE OK? POPJ P,0 ;YES. DONT READ IT AGAIN MOVEI A,HBUF ;MUST READ. WHERE TO PUT IT. MOVEI LBN,DIRBLK ;BLOCK ON TAPE TO READ PUSHJ P,RDBLK ;READ IT CONO DTC,C.STOP ;STOP TAPE IN CASE OF /F COMMAND TRO F,R.DIRI ;HAVE A GOOD DIRECTORY IN CORE NOW POPJ P,0 ;RETURN FROM RDDIR PROCBK: PUSHJ P,SEARCH ;ROUTINE TO READ OR WRITE A BLOCK OF TAPE ; FIRST FIND THE BLOCK (EITHER DIRECTION) MOVEI N,200 ;NUMBER OF WORDS IN A BLOCK TLNE F,L.REV ;WHICH WAY WE GOING? ADDI A,177 ;BACKWARDS. WRITE FROM TOP OF CORE DOWN XCT @0(P) ;CONO WRITE OR READ AOS 0(P) ;COUNT ON TO DATAI OR DATAO PROCLP: CONSZ DTS,S.ERR!S.END ;TROUBLE? PUSHJ P,ERROR ;YES. QUIT CONSO DTS,S.DAT ;WANT DATA MOVED YET? JRST PROCLP ;NO. WAIT SOME MORE. XCT @0(P) ;YES. DATAI OR DATAO TO/FROM BUFFER ADDI A,1 ;COUNT BUFFER POINTER TLNE F,L.REV ;GOING BACKWARDS? SUBI A,2 ;YES. THEN COUNT POINTER BACKWARDS TOO SOJG N,PROCLP ;TRANSFERRED WHOLE BLOCK? CONO DTS,1 ;YES. TELL IT TO DO CHECKSUMMING AND QUIT CONSO DTS,S.JOBD ;DONE? JRST .-1 ;NOT YET. WAIT. JRST CPOPJ1 ;YES. RETURN AFTER THE DATAI/O ARGUMENT SEARCH: MOVEI C,0 ;DRIVE ZERO CONSZ DTC,C.FWD!C.REV ;TAPE GOING AT THE MOMENT? JRST SRCHC ;YES. TRO C,C.FWD!C.DSEL ;NO. MAKE IT GO FORWARD TLZ F,L.REV ;AND GET THE FLAG TO SAY THAT SRCHC: CONO DTC,O.SRCH!C.SEL(C) ;MAKE IT SEARCH SRCHW: CONSZ DTS,S.END ;AT END ZONE? JRST SRCHTA ;YES. TURN AROUND. CONSZ DTS,S.ERR ;ANY ERRORS? PUSHJ P,ERROR ;YES. QUIT. CONSO DTS,S.DAT ;BLOCK NUMBER FOUND? JRST SRCHW ;NO. WAIT FOR IT DATAI DTC,N ;YES. SEE WHAT BLOCK WE ARE AT ANDI N,7777 ;JUST FOR SAFETY, MASK JUNK OUT SUBI N,0(LBN) ;GET THE DISTANCE TO GO JUMPE N,CPOPJ ;IF FOUND, RETURN WITH TAPE ROLLING INTO DESIRED BLK TLNE F,L.REV ;NOT THERE. WHICH WAY WE GOING? MOVNS N ;BACKWARDS. NEGATE. JUMPL N,SEARCH ;IF SHOULD KEEP GOING, ITS MINUS. SRCHTA: CONO DTC,C.FWD!C.REV ;MUST TURN AROUND (END ZONE OR PASSED) TLC F,L.REV ;COMPLEMENT DIRECTION FLAG JRST SEARCH ;SEARCH SOME MORE CPOPJ1: AOS 0(P) ;SUCCESSFUL RETURN CPOPJ: POPJ P,0 ;RETURN. ;TTY I/O SUBRS ERROR: MOVEI C,207 ;MAKE A BELL, EVEN PARITY PUSHJ P,TYO ;TYPE IT OUT JRST 4,GO ;AND RESTART. CRLF: MOVEI C,215 ;CR, EVEN PUSHJ P,TYO ;TYPE IT. MOVEI C,12 ;LF, EVEN TYO: DATAO TTY,C ;SEND OUT CHAR CONSZ TTY,20 ;WAIT FOR IDLE JRST .-1 ; .. POPJ P,0 ;DONE. ;CONSTANTS AND TEMPS. SYSTEM: SIXBIT /TENEX / ;DEFAULT FILENAME DBUFP: XWD -177,DBUF+1 ;POINTER TO DATA BLOCK BYTPTR: POINT 5,HBUF+D.BYT ;POINTER TO BYTES IN DIRECTORY LIT PDP: XWD -PDLL,PDL-1 ;STACK POINTER ;CORE ALLOCATION ZZZ==. DEFINE U(Z)< UU(Z,1)> ;ONE WORD ALLOCATION DEFINE UU(Z,N)< Z=ZZZ ZZZ==ZZZ+N > UU(HBUF,200) ;DIRECTORY OF DTA UU(DBUF,200) ;DATA BUFFER UU(PDL,PDLL) DEPHASE ENDTND: END