TITLE DTBOOT - V003 - DECTAPE BOOTSTRAP (BIG TENDMP) - SUBTTL R. CLEMENTS /RCC/JEF - 16 MAR 71 ;(C) COPYRIGHT DIGITAL EQUIPMENT CORPORATION, MAYNARD MASS 1971 ;"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 ;CORE ALLOCATION IFNDEF REL, ;REL=1 CAUSES A RELOCATABLE ASSEMBLY IFG REL, IFNDEF CORE, ;ASSUME 64K ZZ=CORE-2000+140 ;SET ABOVE JOB DATA AREA OF TOP K CLRTOP=ZZ-1 ;WHEN CLEARING CORE, CLEAR TO HERE DEFINE U(Z)< UU(Z,1)> ;ONE WORD ALLOCATION DEFINE UU(Z,N)< Z=ZZ ZZ=ZZ+N IFGE ,< PRINTX ALLOCATION ERROR >> OPDEF PJRST [JRST] IFE REL, ;PAPER TAPE FORMAT U(DEVICE) ;DEVICE NAME FROM COMMAND U(FNAME) ;FILE NAME FROM COMMAND U(FEXT) ;FILE EXTENSION FROM COMMAND U(SWITCH) ;SWITCHES FROM COMMAND U(TAPEID) ;TAPE NAME FOR Z COMMAND U(PRVLBN) ;LBN SOUGHT ON PREVIOUS SEARCH U(FBN) ;FIRST BLOCK NUMBER, FOR LINK UU(HBUF,200) ;DIRECTORY OF DTA UU(DBUF,200) ;DATA BUFFER FIRSTW==20 ;FIRST LOCATION CONSIDERED ON WRITE PDLL==20 ;STACK LENGTH ;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.DOT=1 ;DOT SEEN IN FILE SPEC L.UPA==2 ;UPARROW (TAPE ID) L.SLA==10 ;SLASH SEEN IN FILE SPEC L.ALL==13 ;ABOVE FLAGS TOGETHER. L.UPA2==20 ;UPARROW AGAIN FOR READING AT ZERO ROUTINE 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.MRG==1 ;MERGE, NOT LOAD. R.WEOF==2 ;ON WHILE WRITING JRST WORD(S) IN LAST BLK R.DIRI==4 ;DIRECTORY IN CORE IS VALID R.STRT==10 ;ON IF LOAD AND GO. OFF IF JUST LOAD ;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 GO: MOVEI F,0 ;CLEAR ALL FLAGS CONO 200000 ;I/O BUS RESET CONO 4,10400 ;CLEAR PI SYSTEM SETZM DEVICE ;CLEAR REQUESTED DEVICE NAME REGO: MOVE P,PDP ;INITIAL STACK POINTER ANDI F,R.DIRI ;CLEAR OUT RANDOM FLAGS SETZM FNAME ;CLEAR REQUESTED FILE NAME SETZM FEXT ;CLEAR REQUESTED FILE EXTENSION SETZM SWITCH ;CLEAR COMMAND SWITCHES PUSHJ P,CRLF ;SAY HELLO GOL: MOVE BP,SIXPTR ;POINTER TO THE WORD. SETZB N,W ;CLEAR ANSWERS. SIXBRL: CONSO TTY,40 ;WAIT FOR A KEY TO BE ST(R)UCK JRST .-1 ; .. DATAI TTY,C ;GET THE CHAR PUSHJ P,TYO ;ECHO IT ANDI C,177 ;ONLY 7 BITS CAIN C,177 ;RUBOUT? JRST REGO ;YES. QUIT. CAIG C,172 ;CHECK FOR LOWER CASE CAIGE C,140 ; .. SKIPA ;NOT L.C. TRZ C,40 ;L.C., MAKE U.C. CAIG C,"Z" ;LETTER? CAIGE C,"A" ; .. SKIPA ;NOT A LETTER. JRST SIXLTR ;LETTER. CAIG C,"9" ;NUMBER? CAIGE C,"0" ; .. JRST GO0 ;NO. RETURN WITH BREAK CHAR. LSH N,3 ;BUILD OCTAL NUMBER ADDI N,-60(C) ;ADD IN THIS DIGIT SIXLTR: TRC C,40 ;MAKE SIXBIT TLNE BP,770000 ;ONLY 6 CHARS IDPB C,BP ;STORE CHAR IN W JRST SIXBRL ;LOOP FOR MORE. GO0: CAIE C,":" ;UNIT DELIMITER? JRST GO1 ;NO. TRZ F,R.DIRI ;DIRECTORY NO GOOD, SELECTING A TAPE ANDI N,7 ;JUST THREE BITS OF UNIT NUMBER MOVEM N,DEVICE ;YES. SAVE NUMBER OF DEVICE JRST GOL ;GO READ MORE. GO1: TLNN F,L.ALL ;ANY SYNTAX REQUESTS? JRST GO6 ;NO. SEE IF FILE NAME. TLZE F,L.DOT ;WAS THERE A DOT? HLLOM W,FEXT ;YES. STORE EXT. RH IS FLAG IF BLANK. TLZE F,L.UPA ;UPARROW? MOVEM W,TAPEID ;YES. SAVE TAPE NAME. TLZE F,L.SLA ;SLASH SWITCH? MOVEM W,SWITCH ;YES. SAVE SWITCH WORD GO7: CAIGE C,175 ;ALTMODE? CAIG C,40 ;SPACE OR CONTROL CHAR? JRST DO ;YES. GO PROCESS COMMAND CAIE C,"." ;FILE EXTENSION REQUEST? JRST GO3 ;NO. TLO F,L.DOT ;YES. REMEMBER THAT JRST GOL ;AND READ ON. GO3: CAIE C,"/" ;SLASH? JRST GO5 ;NO. TLO F,L.SLA ;YES. MARK SWITCH COMING JRST GOL ;RETURN TO SCAN GO5: CAIN C,"^" ;UPARROW? TLO F,L.UPA+L.UPA2 ;YES. NOTE IT. JRST GOL ;LOOP FOR MORE. GO6: SKIPE W ;NO PUNCTUATION. NAME TYPED? MOVEM W,FNAME ;YES. STORE NAME JRST GO7 ;GO CHECK PUNCTUATION ;HERE WHEN COMMAND STRING SUCCESSFULLY READ. DO THE JOB. DO: PUSHJ P,CRLF ;SIGNAL STARTING I/O LDB A,SWPTR ;GET FIRST CHAR OF SWITCHES CAIN A,"Z"-40 ;ZERO COMMAND? JRST ZERO ;YES. CAIN A,"G"-40 ;GO COMMAND? PROGSA: JRST GO ;YES. *** RH MODIFIED *** CAIL A,"0"-40 ;NUMERIC? CAILE A,"7"-40 ; OCTAL, THAT IS, SKIPA ;NO. JRST SETSA ;YES. GO SET STARTING ADDRESS PUSHJ P,RDDIR ;REST OF COMMANDS NEED DIRECTORY LDB A,SWPTR ;GET FIRST CHAR OF SWITCHES CAIN A,"M"-40 ;MERGE? TROA F,R.MRG ;YES. SKIP INTO LOAD, FLAGGING MERGE ONLY CAIN A,"L"-40 ;LOAD COMMAND? JRST LOAD ;YES. CAIN A,"D"-40 ;DUMP COMMAND? JRST DUMP CAIN A,"F"-40 ;FILE DIRECTORY? JRST FILDIR ;YES. CAIN A,"K"-40 ;KILL A FILE (DELETE)? JRST KILL ;YES. JUMPE A,RUN ;IF NO SWITCH, ASSUME LOAD AND RUN PUSHJ P,ERROR ;NO OTHERS IMPLEMENTED SETSA: HRRM N,PROGSA ;STORE PROGRAM STARTING ADDR JRST REGO ;AND WAIT FOR ANOTHER COMMAND FILDIR: MOVSI N,-NFILES ;LIST A QUICK DIRECTORY FILDL: SKIPN B,HBUF+D.NAM(N) ;GET A NAME, IF ANY IN THIS SLOT JRST FILDN ;NONE HERE PUSHJ P,SIXOUT ;TYPE C(B) IN SIXBIT HLLZ B,HBUF+D.EXT(N) ;GET EXTENSION JUMPE B,FILD1 ;IF NOT BLANK, MOVEI C,"." ;DOT PUSHJ P,TYO ;TYPE DOT PUSHJ P,SIXOUT ;TYPE EXT FILD1: PUSHJ P,CRLF ;A CARRIAGE RETURN FILDN: AOBJN N,FILDL ;LOOP FOR ALL NAMES JRST REGO1 ;STOP TAPE AND GO FOR NEXT COMMAND ;LOAD AND RUN COMMANDS RUN: TRO F,R.STRT ;LOAD AND START PROGRAM 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 CAIN EXT,(SIXBIT /SAV/) ;IS IT A SAV FILE? JRST RUN2 ;YES. GO NOTE IT RUN4: AOBJN FN,RUN5 ;LOOP THRU COUNTING ALL FILES SKIPN A ;WAS ONE AND ONLY ONE FOUND? RUN3: MOVE A,SYSTEM ;DEFAULT READ-FILE NAME SKIPN FNAME ;NAME SUPPLIED? MOVEM A,FNAME ;NO. PLUG IN DEFAULT. PUSHJ P,LOOK ;TRY TO FIND FILE PUSHJ P,ERROR ;NOT THERE. FAIL. 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 MOVE A,BLTXWD ; .. TRNN F,R.MRG ;UNLESS MERGE ONLY, BLT A,CLRTOP ;CLEAR UP TO BASE OF THIS PROGRAM 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. RUN2: JUMPN A,RUN3 ;IF ALREADY ONE, THIS IS 2. QUIT. MOVE A,HBUF+D.NAM(FN) ;FIRST SAV FILE. GET ITS NAME. JRST RUN4 ;AND SEE IF ANY MORE. STARTQ: HRRM W,PROGSA ;SAVE THE STARTING ADDRESS REGO1: CONO DTC,C.STOP ;STOP THE TAPE TRNE F,R.STRT ;LOAD OR START? JRST 0(W) ;START JRST REGO ;JUST LOAD. GO GET ANOTHER COMMAND ;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 DUMP: MOVE A,CRASH ;DEFAULT FILE NAME SKIPN FNAME ;NAME ALREADY SET? MOVEM A,FNAME ;NO. USE DEFAULT PUSHJ P,ENTR ;TRY TO FIND THE FILE. PUSHJ P,ERROR ;NO FREE SLOTS (OR MAYBE NO BLKS LEFT) MOVEM LBN,FBN ;SAVE AS FIRST BLOCK NUMBER MOVEI Q,0 ;INITIALIZE DATA BLOCK COUNTER MOVEI M,FIRSTW-1 ;AND CORE ADDRESS COUNTER DUMPL2: HRRZS X,M ;START OF A BLOCK DUMPL1: SKIPN 1(X) ;THIS WORD ZERO IN CORE? JRST DUMP1 ;YES. SEE IF END OF A BLOCK. CAIGE X,CLRTOP ;LOOKED AT ALL OF CORE? AOJA X,DUMPL1 ;NO. COUNT PART OF THIS BLOCK, LOOK ON. DUMP1: MOVEI W,0(M) ;END OF BLOCK. IS BLOCK EMPTY? SUBI W,0(X) ;START MINUS END OF BLK JUMPE W,DUMP2 ;JUMP IF BLOCK EMPTY HRL M,W ;MAKE -COUNT,,START-1 FOR COUNTER MOVE W,M ;AND FOR DATA IN FILE PUSHJ P,WWORD ;WRITE IT OUT AS DATA DUMPL3: MOVE W,1(M) ;GET THE WORD FROM CORE PUSHJ P,WWORD ;OUTPUT TO FILE AOBJN M,DUMPL3 ;OUTPUT ALL OF BLOCK DUMP2: CAIGE X,CLRTOP ;CONSIDERED ALL OF CORE? AOJA M,DUMPL2 ;NO. MOVE ON. TRO F,R.WEOF ;FLAG WRITING LAST BLK, SO NO ALLOC MOVE W,PROGSA ;YES. APPEND STARTING ADDRESS PUSHJ P,WWORD ;WRITE OUT THIS WORD JUMPL Q,.-1 ;IF MORE TO GO IN BLOCK, WRITE AGAIN JRST CLS ;WRITE OUT THE DIRECTORY ;AND RESTART PROGRAM FOR NEXT COMMAND ;SUBROUTINE TO WRITE A WORD INTO THE FILE WWORD: SKIPL Q ;NEED A NEW POINTER? MOVE Q,DBUFP ;YES. MOVEM W,0(Q) ;PUT WORD INTO BUFFER AOBJN Q,CPOPJ ;COUNT POINTER. DONE? MOVE A,FBN ;GET FIRST BLOCK NUMBER LSH A,10 ;PUT IN RIGHT PLACE TRO A,177 ;DECLARE 127 WORDS IN BLOCK USED HRRZM A,DBUF+0 ;PUT IN LINK WORD TRNE F,R.WEOF ;WRITING LAST BLK? JRST WWORD1 ;YES. DONT ALLOCATE ANOTHER PUSH P,LBN ;SAVE BLOCK ABOUT TO WRITE PUSHJ P,ALLOC ;GET NEXT BLOCK OF FILE PUSHJ P,ERROR ;NONE AVAILABLE HRLM LBN,DBUF+0 ;PUT IN LINK WORD POP P,LBN ;RESTORE BLOCK FOR WRITING NOW WWORD1: PUSHJ P,WRDATA ;OUTPUT BLOCK, IF POSSIBLE HLRZ LBN,DBUF+0 ;GET LINK TO NEXT BLOCK IN LBN POPJ P,0 ;OK. RETURN. ;SUBROUTINE TO LOOK FOR FILE LOOK: MOVE NAME,FNAME ;GET DESIRED FILENAME MOVSI EXT,(SIXBIT /SAV/) ;DEFAULT EXTENSION SKIPE FEXT ;ANY SUPPLIED? HLLZ EXT,FEXT ;YES. USE IT. SRCHFD: MOVSI FN,-NFILES ;MAKE AOBJN COUNTER SCHL2: MOVE B,HBUF+D.NAM(FN) ;GET A FILE NAME CAME B,NAME ;IS NAME RIGHT? JRST SCHN2 ;NO. MOVE ON. HLLZ B,HBUF+D.EXT(FN) ;CHECK THE EXTENSION CAMN B,EXT ;IS IT RIGHT TOO? AOJA FN,CPOPJ1 ;YES. GOOD RETURN, ANSWER IS FILE NUMBER IN FN SCHN2: AOBJN FN,SCHL2 ;COUNT FILE, EXT. CHECK NEXT FILE IN FD POPJ P,0 ;FAIL RETURN, NOT FOUND. ;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 ZERO: MOVE A,TAPEID ;COPY TAPE NAME IF ANY MOVEM A,HBUF+177 ; .. TLZN F,L.UPA2 ;WAS ONE THERE? PUSHJ P,RDDIR ;NO. GET THE ONE ON TAPE SETZM HBUF ;CLEAR OUT REST OF DIR MOVE A,[XWD HBUF,HBUF+1] ; .. BLT A,HBUF+176 ; .. MOVSI A,(<36B4+36B9>) ;ALLOCATE BLOCKS 1 AND 2 MOVEM A,HBUF+D.BYT+0 ; .. MOVSI A,(36B9) ;AND BLOCK 144 MOVEM A,HBUF+D.BYT+16 ; .. HRLOI A,7 ;AND THE NONEXISTENT ONES MOVEM A,HBUF+D.BYT+122 ; .. CLS: PUSHJ P,WRDIR ;WRITE OUT THE DIRECTORY JRST REGO1 ;STOP TAPE AND RETURN TO COMMAND SCANNER WRDIR: MOVEI LBN,DIRBLK ;BLOCK TO WRITE MOVEI A,HBUF ;DATA TO WRITE PJRST WRBLK ;WRITE IT WRDATA: MOVEI A,DBUF ;WRITE FROM DATA BUFFER WRBLK: PUSHJ P,PROCBK ;PROCESS THE BLOCK CONO DTC,O.WRIT ;ARGS TO PROCBK TO CAUSE IT DATAO DTC,0(A) ;TO WRITE THE BLOCK ONTO TAPE POPJ P,0 ;RETURN FROM WRBLK 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: MOVE C,DEVICE ;GET DRIVE NUMBER LSH C,11 ;PUT IN UNIT DIGIT FOR CONO 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 DELETE: PUSHJ P,LOOK ;SEE IF FILE EXISTS ALREADY POPJ P,0 ;NO. FAIL RETURN SETZB B,HBUF+D.NAM-1(FN) ;FOUND IT. CLEAR NAME SETZM HBUF+D.EXT-1(FN) ;AND EXT IN DIRECTORY MOVE BP,BYTPTR ;INITIAL BYTE POINTER TO DIRECTORY BYTES MOVEI N,MAXBLK ;SEARCH ALL BYTES FOR THIS FILE ILDB A,BP ;GET A DIRECTORY BYTE CAIN A,0(FN) ;BELONG TO THIS FILE? DPB B,BP ;YES. CLEAR IT OUT, ITS FREE NOW SOJG N,.-3 ;LOOP FOR WHOLE DIRECTORY CPOPJ1: AOS 0(P) ;SUCCESSFUL RETURN CPOPJ: POPJ P,0 ;RETURN. KILL: PUSHJ P,DELETE ;REMOVE FILE FROM DIRECTORY PUSHJ P,ERROR ;NOT THERE, GIVE A BELL JRST CLS ;WRITE DIRECTORY AND RETURN TO CMD SCAN ENTR: PUSHJ P,DELETE ;FIRST REMOVE OLD FILE BY THIS NAME JFCL ;MAY NOT HAVE BEEN ONE, THATS OK MOVSI FN,-NFILES ;SEARCH FOR A FREE SLOT SKIPN HBUF+D.NAM(FN) ;SLOT FREE? AOJA FN,ENTR1 ;YES. CONVERT RH TO FILE NUMBER, GO USE. AOBJN FN,.-2 ;LOOK FOR ANOTHER POPJ P,0 ;NONE FREE. WE LOSE. ENTR1: MOVEM NAME,HBUF+D.NAM-1(FN) ;STORE THE FILE NAME IN FREE SLOT HLLZM EXT,HBUF+D.EXT-1(FN) ;AND THE EXTENSION ALLOCI: SETZM PRVLBN ;INITIALIZE POINTERS FOR ALLOCATOR MOVE BP,BYTPTR ;START HAVING CHECKED BLK 0. TLZ F,L.REVA ;NOT REVERSE ALLOCATING ALLOC: TLZ F,L.TURN ;ALLOCATOR HASNT TURNED AROUND MOVE LBN,PRVLBN ;RESTORE PREVIOUS LBN ALLOCP: TLNE F,L.REVA ;WHICH WAY WE LOOKING? JRST ALCN2 ;NEXT BACK JRST ALCN1 ;NEXT FORWARD ALCL1: ILDB N,BP ;GET A BLOCK BYTE JUMPE N,ALLOC1 ;IF ITS FREE, MAY USE IT ALCN1: CAIGE LBN,MAXBLK ;LOOKED ALL THRU FORWARD? AOJA LBN,ALCL1 ;NO. TRY ANOTHER ALLOCT: TLOE F,L.TURN ;TURN SEARCH AROUND. BETTER NOT BE SECOND TURN POPJ P,0 ;LOOKED THRU AND DIDNT FIND ANYTHING. QUIT. TLC F,L.REVA ;LOOK THE OTHER WAY JRST ALLOCP ;GO SEE WHICH WAY NOW ALCL2: ADD BP,[XWD 050000,0] ;MOVE LEFT A BYTE SKIPGE BP ;OFF THE END OF THE WORD? SUB BP,[XWD 430000,1] ;YES. BACK A WORD, RIGHT 35 BITS LDB N,BP ;GET THIS BYTE JUMPE N,ALLOC1 ;IF ITS FREE MAY USE IT. ALCN2: CAILE LBN,1 ;GONE ALL THE WAY TO THE FRONT? SOJA LBN,ALCL2 ;NO, LOOK FURTHER JRST ALLOCT ;YES. MUST TURN ALLOCATOR AROUND ALLOC1: MOVE N,PRVLBN ;HAVE A FREE ONE. WANT IT? SUBI N,0(LBN) ;FIND DISTANCE FROM LAST ONE MOVMS N ;WHICHEVER DIRECTION CAIGE N,BLKFAC ;IS IT FAR ENOUGH AWAY? TLNE F,L.TURN ;OR ARE WE TURNING ALLOCATOR AROUND? JRST ALLOCY ;YES. USE THIS ONE. JRST ALLOCP ;NO. PROCEED TO ANOTHER BLOCK ALLOCY: DPB FN,BP ;PUT THIS FILE NUMBER IN THE BLOCK'S BYTE MOVEM LBN,PRVLBN ;SAVE AS PREVIOUS BLOCK ALLOCATED JRST CPOPJ1 ;AND RETURN WITH LBN SET UP ;TTY I/O SUBRS ERROR: MOVEI C,207 ;MAKE A BELL, EVEN PARITY PUSHJ P,TYO ;TYPE IT OUT JRST 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. SIXOUT: MOVEI C,0 ;SO DONT SHIFT IN JUNK ROTC B,6 ;GET A SIXBIT CHAR IN C ADDI C,40 ;MAKE IT ASCII PUSHJ P,TYO ;TYPE IT JUMPN B,SIXOUT ;IF ANY MORE, TYPE THEM POPJ P,0 ;AND RETURN ;CONSTANTS AND TEMPS. SYSTEM: SIXBIT /SYSTEM/ ;DEFAULT FILENAME CRASH: SIXBIT /CRASH/ ;DEFAULT DUMP NAME DBUFP: XWD -177,DBUF+1 ;POINTER TO DATA BLOCK BLTXWD: XWD 40,41 ;FOR CORE-CLEARING SIXPTR: XWD 440600,W ;POINTER FOR SIXBIT NAME BYTPTR: POINT 5,HBUF+D.BYT ;POINTER TO BYTES IN DIRECTORY SWPTR: POINT 6,SWITCH,5 ;POINTER TO FIRST SWITCH CHARACTER LIT UU(PDL,PDLL) ;STACK PDP: XWD -PDLL,PDL-1 ;STACK POINTER UU(ZZMAX,0) SLOP==576-<.-GO> ;MUST BE POSITIVE IF WANT ;THIS TO FIT IN BLKS 0,1,2 OF DTA ;THREE BLOCKS INCLUDING HRI BLKI WD AND JRST WD END GO