X-Git-Url: http://git.sky-visions.com/cgi-bin/gitweb.cgi/retro-software/dec/tops10/v4.5.git/blobdiff_plain/d693caac75dd25e668e43e85c29205bfc8dea06e..bb920f47d2b4fd2ac0c46c72df890dfe6931e943:/src/dtboot.mac diff --git a/src/dtboot.mac b/src/dtboot.mac new file mode 100644 index 0000000..027d458 --- /dev/null +++ b/src/dtboot.mac @@ -0,0 +1,533 @@ +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 + \ No newline at end of file