diff --git a/build/misc.tcl b/build/misc.tcl index 99b16321..548c6fc9 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -894,3 +894,7 @@ expect ":KILL" respond "*" ":midas /t device;jobdev glp_sysen2;xgpdev\r" respond "with ^C" "GLP==1\r\003" expect ":KILL" + +# KL10 front end directory tool +respond "*" ":midas sys1;ts klfedr_syseng;klfedr\r" +expect ":KILL" diff --git a/doc/programs.md b/doc/programs.md index a1175311..6a77dbbd 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -96,6 +96,7 @@ - JEDGAR, counter spying tool. - JOBS, list jobs by category. - JOTTO, word-guessing game. +- KLFEDR, KL10 frontend directory tool. - LAY, SUDS layout program. - LD10, Lisp display slave. - LIMERI, print limerics. diff --git a/src/syseng/klfedr.83 b/src/syseng/klfedr.83 new file mode 100755 index 00000000..dea24ae5 --- /dev/null +++ b/src/syseng/klfedr.83 @@ -0,0 +1,1743 @@ + TITLE KLFEDR + +;KL-10 "FRONT-END" DIRECTORY HACKER + +.MLLIT==1 +IF1, EXPUNGE MAP ;PINHEADS + +.INSRT SYSTEM;RH10 > +NUDSL==100. ;DUMMY +.INSRT SYSTEM;FSDEFS > + +A=1 +B=2 +C=3 +D=4 +E=5 +T=6 +TT=7 +T2=10 +I=11 +J=12 +Q=13 +R=14 +P=16 + +ERRC==1 .SEE ERPNT +TYIC==2 ;TYPE IN +TYOC==3 ;TYPE OUT +DKIC==4 ;ITS FILE INPUT +DKOC==5 ;ITS FILE OUTPUT +ALCH==6 ;ALLOCATE AND OTHER RANDOM USAGE +XFLC==7 ;"EXECUTE FILE" CHANNEL + +.WOV==100000+.UIO ;WRITE-OVER MODE +ERCODE==403000,, ;SUITABLE WAY TO END .CALL ARGUMENT LIST + +DIR=200000 ;WHERE TO MAP DIRECTORY IN +DIRPG==DIR/2000 ;PAGE +NDIRPG==70000/2000 ;NUMBER OF PAGES OF DIR +FILE=300000 ;WHERE TO MAP FILE IN +FILPG==FILE/2000 ;PAGE +NFILPG==500000/2000 ;NUMBER OF PAGES OF FILE + +LPDL==100 +PDL: -LPDL,,. + BLOCK LPDL + +LBUF==2000 +BUF: BLOCK LBUF + +ERROR: 0 ;ERROR CODE, 4.9 => RH -> ASCIZ, ELSE STD ITS ERR CODE +P.B.N.: 0 ;CYL,,SURF_8+SECT OF FILE CREATED BY CTGALC +N.C.B.: 0 ;NUMBER OF CONSECUTIVE SECTORS OF FILE... +FAKE: 0 ;-1 => NOT USING A REAL KLDCP FILE SYSTEM, IGNORE PBN +GOTDIR: 0 ;-1 => MAPDIR HAS BEEN CALLED + +JCLF: 0 ;-1 READING FROM JCL INSTEAD OF TTY +XFLF: 0 ;-1 READING FROM EXECUTE FILE INSTEAD OF TTY +JCLBUF: BLOCK 20 +JCLEND==.-1 + +DIRDEV: SIXBIT /DK0/ ;NAME OF FILE CONTAINING THE KLDCP DIRECTORY +DIRSNM: SIXBIT /.KLFE./ +DIRFN1: SIXBIT /KLDCP/ +DIRFN2: SIXBIT /(DIR)/ + +CTGDEV: SIXBIT /DK0/ ;NAMES FOR FILE CREATED BY CTGALC +CTGDIR: SIXBIT /.KLFE./ +CTGFN1: SIXBIT /_TEMP_/ +CTGFN2: SIXBIT /KLFEDR/ + +FAKFN1: SIXBIT /.KLFE./ ;COPY OF ORIGINAL UFD, USED IN FAKE MODE +FAKFN2: SIXBIT /(UFD)/ +FAKUFD: BLOCK 2000 + +QBTBLI: REPEAT UFDBPW+1, <44-.RPCNT*UFDBYT>_36+UFDBYT_30 + +PAT: +PATCH: BLOCK 100 + +TICFN1: SIXBIT/SMALL/ +TICFN2: SIXBIT/FILES0/ +TICFSZ==30.*8 + +;;;; THIS PAGE DEFINES WHAT GOES ON THE DISK + +;FORMAT OF KLDCP DIRECTORY ENTRIES + +DR.NAM==0 ;2 WORDS OF PDP-11 SQUOZE +DR.EXT==1 ;LH EXTENSION IN PDP-11 SQUOZE +DR.DAT==1 ;RH SMITHSONIAN CREATION DATE +DR.PBN==2 ;PHYS BLOCK NO: CYL,,SURF_8+SECT +DR.ALC==3 ;NUMBER OF WORDS ALLOCATED: HIGH 16 BITS,,LOW 16 BITS +DR.WRT==4 ;NUMBER OF WORDS WRITTEN: HIGH 16 BITS,,LOW 16 BITS +DR.11A==5 ;PDP11 LOAD ADDRESS,,START ADDRESS +DR.STS==6 ;LH "FILE STATUS" NOT USED BY KLDCP. 0 ITS FILE, 1 SEE TOAD3 +DR.CKS==6 ;RH 16-BIT SUM OF ALL WORDS WRITTEN IN FILE, CARRIES ADDED IN +DR.7==7 ;RESERVED MUST BE ZERO + +;ON MAGTAPE THERE ARE A BUNCH OF FILES, CONSISTING OF THIS 8-WORD +;HEADER FOLLOWED BY THE DATA, THEN AN EOF MARK. +;AFTER THE LAST FILE, 2 EOF MARKS. + +;ON DISK, SECTORS 1 AND 10 DECIMAL +;ARE "HOME BLOCKS" WHICH CONTAIN PHYSICAL DISK ADDRESS AND NUMBER +;OF SECTORS OF THE DIRECTORY. HOME BLOCKS AND DIR HAVE TO BE +;SET UP BY HAND. THE DIRECTORY IS A FILE IN THE ITS FILE SYSTEM. +;SECTOR 0 CONTAINS A BOOT PROGRAM WHICH IS READ IN BY THE BOOT ROM +;WHEN THE DISK BUTTON IS PUSHED. IT'S A PDP-11 PROGRAM. IT READS +;IN THE "PRIMARY BOOTSTRAP" FROM A DISK ADDRESS HARD-WIRED INTO IT. +;THE PRIMARY BOOTSTRAP FINDS KLDCP IN THE DIRECTORY AND RUNS IT. +;TO CHANGE THE DISK SIZE, YOU MUST CHANGE SEVERAL ADDRESSES IN THE +;HOME BLOCKS AND IN THE SECTOR 0 BOOT PROGRAM. OF COURSE YOU MUST +;ALSO CHANGE SEVERAL PDP10 PROGRAMS. + +;THE FILE KLDCP;HOME BLOCKS CONTAINS A COPY OF SECTORS 0-15. OF THE DISK. +;THE FILE KLDCP;PRIMRY BOOT CONTAINS A COPY OF THE PRIMARY BOOTSTRAP. +;THESE ARE JUST REFERENCE COPIES, THEY AREN'T STORED IN THE ACTUAL +;SPECIAL DISK ADDRESSES WHERE THOSE THINGS GO. + +;THERE IS ALSO AN INDEX FILE AND A BIT MAP, WHICH WE DON'T USE. +;THEY ARE SET UP TO BE UP IN THE MAINTENANCE CYLINDERS SOMEPLACE, +;TO MAKE KLDCP HAPPY, ALTHOUGH IT DOESN'T USE THEM EITHER. +;ALSO, THE FIRST 6 SECTORS OF CYLINDER 406 (DECIMAL) +;CONTAIN THE "PRIMARY BOOTSTRAP." THIS HAS TO BE SET UP BY HAND. + +;ALLOCATION OF CYLINDERS ON AN RP04: +; 0-405. ITS FILE SYSTEM +; 406. PRIMARY BOOTSTRAP, KLDCP NOT-USED FILES +; 407. DSKDMP BOOT AND SWAP AREA +; 408. NOT USED +; 409. NOT USED +; 410. DDT BOOT AND SWAP AREA + +;FORMAT OF SECTOR 0: +; ONE PDP-11 WORD PER PDP-10 HALFWORD +; RH(20) IS THE CYLINDER NUMBER OF THE PRIMARY BOOTSTRAP +; IT'S ON HEAD 0, SECTORS 0-4 + +; INDEX FILE OFFSETS - IN PDP-10 HOME BLOCK + +REPEAT 0,[ +WORD61==61 ;"KLFEDDCS" - KL10 FRONT END DOUBLY +WORD62==62 ;DIRECTORIED CONTIGUOUS STRUCTURE +WORD63==63 +WORD64==64 ;LH=1 (406 - 409) =3 (406 - 409 0 - 399) + ;RH=PHYSICAL BLOCK NO.(PBN) OF INDEX FILE +WORD65==65 ;LH=PBN OF INDEX FILE + ;RH=NO OF CONSECUTIVE BLOCKS (NCB) +WORD66==66 ;PBN OF DIRECTORY FILE +WORD67==67 ;LH=NCB OF DIRECTORY FILE + ;RH=PBN OF BIT MAP +WORD70==70 ;LH=PBN + ;RH==NCB OF BIT MAP +WORD71==71 ;PBN OF BAD BLOCK FILE +WORD72==72 ;LH=NCB OF BAD BLOCK FILE + ;RH=PBN OF EXTENDED HOME BLOCK FILE +WORD73==73 ;LH=PBN + ;RH=NCB OF EXTENDED HOME BLOCK FILE +WORD74==74 ;12 PDP-11 8-BIT ASCII CHARACTERS +WORD75==75 ;GIVING THE FUNCTION FOR WHICH THE PDP-11 +WORD76==76 ;FILE STRUCTURE IS USED NORMALLY EITHER + ;"SYSTEM PACK " OR "DIAGNOSTICS " +WORD77==77 ;12 PDP-11 8-BIT ASCII CHARACTERS +WOR100==100 ;GIVING THE NAME OF THE PACK OWNER +WOR101==101 +WOR102==102 ;RESERVED; WILL BE INITIALIZED TO ZEROES +WOR103==103 +WOR104==104 +] ;END OF REPEAT 0 + +;JSP TT,INIT TO SET UP PDL, TYIC, TYOC + +INIT: MOVE P,PDL + SETZM GOTDIR + PUSH P,TT + .OPEN TYIC,[.UAI,,'TTY] + .VALUE + .OPEN TYOC,[%TJDIS+.UAO,,'TTY] + .VALUE + .CALL [ SETZ + SIXBIT /CNSGET/ + MOVEI TYOC + REPEAT 4,MOVEM NOWHER' + SETZM TT ] + MOVEI TT,0 + SETZM DISTTY' + TLNE TT,%TOERS + SETOM DISTTY + + SETOM JCLF + SETZM JCLF2' + SETZM JCLBUF + MOVE T,[JCLBUF,,JCLBUF+1] + BLT T,JCLEND + .BREAK 12,[5,,JCLBUF] + MOVE T,[440700,,JCLBUF] + MOVEM T,JCLP' + SKIPN JCLBUF + SETZM JCLF + SETZM KLGF + SETZM KLGP + POPJ P, + +;READ CHARACTER FROM JCL OR TTY +;CHAR RETURNED IN T + +RCH: AOS JCLF2 + SKIPE XFLF + JRST RCHFLI + SKIPN JCLF + JRST RCHTYI + ILDB T,JCLP + CAIE T,^M + CAIN T,^C + CAIA + JUMPN T,CPOPJ + MOVEI T,^M ;JCL ENDS WITH ^@, ^C, OR ^M + SETZM JCLF + SETOM JCLF2 + POPJ P, + +RCHTYI: .IOT TYIC,T + CAIN T,^G + JRST RESTRT + POPJ P, + +RCHFLI: .IOT XFLC,T + JUMPL T,RCHFL2 ;EOF + CAIE T,33 + CAIN T,^M + JRST RCHFL1 + CAIGE T,40 + JRST RCHFLI ;IGNORE RANDOM CONTROL CHARS +RCHFL1: .IOT TYOC,T + POPJ P, + +RCHFL2: .CLOSE XFLC, + SETZM XFLF + JRST RCH + +;READ SIXBIT SYLLABLE INTO A, RETURN DELIMITER IN T +;DELIMITERS ARE NON-SIXBIT PLUS COLON, SEMICOLON, QUESTION, AND SPACE +;SKIP RETURN UNLESS FULLY RUBBED-OUT + +GETSYL: MOVEI A,0 + MOVE TT,[440600,,A] +GETSY0: PUSHJ P,RCH + CAIN T,177 + JRST GSYRUB + CAIE T,"? + CAIG T,40 + JRST POPJ1 + CAIE T,": + CAIN T,"; + JRST POPJ1 + CAIL T,"a + CAILE T,"z + SUBI T,40 + TLNE TT,770000 + IDPB T,TT + JRST GETSY0 + +GSYRUB: MOVEI T,[ASCIZ/XXX /] + JUMPL TT,7TYPE ;WHOLE SYLLABLE RUBBED OUT, POPJ + LDB T,TT + ADDI T,40 + SKIPN DISTTY + JRST [ .IOT TYOC,T + JRST GSYRB1 ] + .IOT TYOC,[^P] + .IOT TYOC,["X] +GSYRB1: MOVEI T,0 + DPB T,TT + ADD TT,[060000,,] + JRST GETSY0 + +;FILE NAME READER. STORES INTO DEV, FN1, FN2, SNM +;RETURNS: NO SKIP, FULLY RUBBED OUT. SKIP, WON. + +FNR: MOVSI T,'DSK ;DEFAULTS + MOVEM T,DEV + .SUSET [.RSNAME,,SNM] +FNR00: SETZM FN1 ;FN1 NOT TYPED YET + SETZM FN2 +FNR0: PUSHJ P,GETSYL ;READ NEXT SYLLABLE + POPJ P, ;FULLY RUBBED OUT + CAIN T,": + MOVEM A,DEV' + CAIN T,"; + MOVEM A,SNM' + CAIE T,": + CAIN T,"; + JRST FNR0 + JUMPE A,FNR3 + SKIPN FN1 + JRST [ MOVEM A,FN1' + JRST FNR3 ] + MOVEM A,FN2' +FNR3: CAIL T,40 + JRST FNR0 + SKIPE TT,FN1 ;IF FN1 GIVEN, BUT NOT FN2, + MOVSI TT,(SIXBIT/>/) ; DEFAULT FN2 TO >. + SKIPN FN2 + MOVEM TT,FN2 + ;RETURN WITH DELIM CHAR IN T +POPJ1: AOSA (P) +POPAJ: POP P,A +CPOPJ: POPJ P, + +;ALLOCATE A CONTIGUOUS FILE +;NUMBER OF WORDS IN A +;SKIP RETURN IF WIN + +CTGALC: MOVEI T,20. ;NUMBER OF TRIES + MOVEM T,ERCNT' + MOVE T,A + ADDI T,177 + LSH T,-7 + MOVEM T,N.C.B. + CAIG T,NBLKSC*SECBLK + JRST CTGAL0 + HRROI T,[ASCIZ/FILE IS BIGGER THAN A CYLINDER/] + MOVEM T,ERROR + POPJ P, + +CTGAL0: .CALL [ SETZ + 'DELETE + CTGDEV + CTGFN1 + CTGFN2 + CTGDIR + ERCODE ERROR ] + JFCL + .CALL [ SETZ + SIXBIT /OPEN/ + [.BIO,,ALCH] + CTGDEV + CTGFN1 + CTGFN2 + CTGDIR + ERCODE ERROR ] + POPJ P, ;LOST + + SETZM BUF ;MAKE THE FILE FULL OF RIGHT AMOUNT OF ZEROS + MOVE T,[BUF,,BUF+1] + BLT T,BUF+LBUF-1 + MOVE T,A + ADDI T,1777 + LSH T,-10. ;NUMBER OF BLOCKS +CTGAL1: MOVE T2,[-2000,,BUF] + .IOT ALCH,T2 + SOJG T,CTGAL1 + .CLOSE ALCH, + MOVE B,CTGFN1 ;GET P.B.N. AND N.C.B. + MOVE C,CTGFN2 + SKIPE FAKE + JRST POPJ1 + PUSHJ P,ABSADR + JRST CTGAL2 ;FAILED TO MAKE CONTIGUOUS + MOVEM B,P.B.N. + MOVE T,A + ADDI T,177 + LSH T,-7 + CAMG T,C + JRST POPJ1 + MOVEI T,[ASCIZ/CTGALC- ABSADR MADE FILE TOO SHORT!/] + PUSHJ P,7TYPE + .VALUE + +CTGAL2: SOSL ERCNT + JRST CTGAL0 ;TRY AGAIN, QTUTP MIGHT HAVE ADVANCED + ; INTO BETTER REGION OF THE DISK + HRROI T,[ASCIZ/CAN'T ALLOCATE FILE CONTIGUOUSLY AFTER 20 TRIES/] + MOVEM T,ERROR + POPJ P, ;LOST + +;ROUTINE TO FIND ABSOLUTE DISK ADDRESS OF A FILE IN THE .KLFE. DIRECTORY +;CALL WITH B,C FILENAMES +;RETURNS WITH B=P.B.N., C=N.C.B. +;SKIPS IF CONTIGUOUS +;CLOBBERS D,E,T,TT,T2; USES ALCH AND BUF + +ABSADR: .CALL [ SETZ ;READ IN THE DIRECTORY + SIXBIT /OPEN/ + [.BII,,ALCH] + CTGDEV + [SIXBIT/.FILE./] + [SIXBIT/(DIR)/] + SETZ CTGDIR ] + .VALUE + MOVE T2,[-2000,,BUF] + .IOT ALCH,T2 + .CLOSE ALCH, + SKIPN FAKE + JRST ABSAD0 + MOVE T2,[FAKUFD,,BUF] ;USE DIR RESTORED FROM BACKUP TAPE + BLT T2,BUF+1777 +ABSAD0: MOVE T2,BUF+UDNAMP +ABSAD1: CAIL T2,2000 ;SEARCH FOR THE FILE + POPJ P, ;NOT FOUND + CAMN B,BUF+UNFN1(T2) + CAME C,BUF+UNFN2(T2) + JRST [ ADDI T2,LUNBLK + JRST ABSAD1 ] + LDB T,[UNDSCP BUF+UNRNDM(T2)] + IDIVI T,UFDBPW + ADDI T,BUF+UDDESC + HLL T,QBTBLI(TT) + ILDB TT,T ;SHOULD START WITH JUMP + TRNN TT,40 + JRST ABSAD5 + MOVEI D,-40(TT) ;COMPUTE P.B.N. FROM ITS BLK NO +REPEAT NXLBYT,[ + ILDB TT,T + LSH D,UFDBYT + ADD D,TT +] + IDIVI D,NBLKSC + HRLZM D,B ;STORE CYLINDER NUMBER + MOVE D,E + IMULI D,SECBLK + IDIVI D,NSECS ;COMPUTE SURFACE & SECTOR + LSH D,8 + ADD D,E + HRRM D,B ;STORE SURFACE_8+SECTOR + MOVEI C,1 ;1 BLK TO START +ABSAD3: ILDB TT,T ;ONLY ALLOWED DESCRIPTORS ARE TAKE-N + JUMPE TT,ABSAD6 ;END, SO WE WON. + CAILE TT,UDTKMX + POPJ P, ;NOT CONTIGUOUS + ADD C,TT + JRST ABSAD3 + +ABSAD5: MOVEI T,[ASCIZ/ABSADR- INTERNAL FILE SCREWED UP/] + PUSHJ P,7TYPE + .VALUE + +ABSAD6: IMULI C,SECBLK ;CONVERT C TO SECTORS + MOVE T,C ;VERIFY THAT IT DOESN'T CROSS A CYLINDER BOUNDARY + LDB TT,[001000,,B] + ADD T,TT + IDIVI T,NSECS + LDB TT,[101000,,B] + ADD T,TT + IDIVI T,NHEDS + JUMPE T,POPJ1 ;IT DOESN'T, WE WON + POPJ P, ;IT DOES, LOSE + +;MAP DIRECTORY INTO ADDRESS SPACE AT LOCN 'DIR' +;SKIP RETURN IF WIN + +MAPDIR: SKIPE GOTDIR + JRST POPJ1 + PUSH P,DEV + PUSH P,SNM + PUSH P,FN1 + PUSH P,FN2 + MOVE T,DIRDEV + MOVEM T,DEV + MOVE T,DIRSNM + MOVEM T,SNM + MOVE T,DIRFN1 + MOVEM T,FN1 + MOVE T,DIRFN2 + MOVEM T,FN2 + .CALL [ SETZ + SIXBIT /OPEN/ + [.WOV,,ALCH] + DIRDEV + DIRFN1 + DIRFN2 + DIRSNM + ERCODE ERROR ] + JRST [ SUB P,[4,,4] + JRST FILERR ] + .CALL [ SETZ + 'FILLEN + MOVEI ALCH + SETZM TT ] + .VALUE + MOVEI TT,DIR(TT) + MOVEM TT,DIREND' + MOVE TT,[-NDIRPG,,DIRPG] + POP P,FN2 + POP P,FN1 + POP P,SNM + POP P,DEV + PUSHJ P,MAP + POPJ P, + SETOM GOTDIR + JRST POPJ1 + +;MAP FILE, OPEN ON ALCH, INTO ADDRESS SPACE AT LOCN 'FILE' +;SKIP RETURN IF WIN + +MAPFIL: MOVE TT,[-NFILPG,,FILPG] + +MAP: SETZB T,T2 + .CALL [ SETZ ;DON'T LET THE G*F*R* GET THIS FILE + 'SREAPB + MOVEI ALCH + SETZI 1 ] + .VALUE + .CALL [ SETZ ;DON'T BOTHER DUMPING IT ON BACKUP TAPE + 'SDMPBT ;SINCE RELOADING IT WOULD LOSE. + MOVEI ALCH + SETZI 1 ] + .VALUE + .CALL [ SETZ + 'CORBLK + MOVEI %CBRED+%CBNDR+%CBWRT+%CBNDW + MOVEI -1 + TT + MOVEI ALCH + T + ERCODE T2 ] + JRST MAP1 + SKIPL TT + HRROI T2,[ASCIZ/FILE TOO BIG TO MAP INTO ADDRESS SPACE/] +MAP1: MOVEM T2,ERROR + CAIE T2,32 ;OK IF JUST EOF + JRST ERPNT + JRST POPJ1 ;WIN + +;UNMAP THE FILE + +UNMAPF: MOVE TT,[-NFILPG,,FILPG] + .CALL [ SETZ + 'CORBLK + MOVEI 0 + MOVEI -1 + SETZ TT ] + .VALUE + POPJ P, + +;READ COMMAND + +READF: PUSHJ P,MAPDIR + .VALUE + MOVE A,FN1 + PUSHJ P,SQUEEZ + HRRZM B,SQZFN1 + MOVSS A + PUSHJ P,SQUEEZ + HRLM B,SQZFN1 + MOVS A,FN2 + PUSHJ P,SQUEEZ + HRLZM B,SQZFN2 + MOVE C,SQZFN1 + MOVE D,SQZFN2 + PUSHJ P,11LOOK + JRST [ HRROI TT,[ASCIZ/FILE NOT FOUND IN FRONT-END DIRECTORY/] + MOVEM TT,ERROR + JRST FILERR ] + PUSHJ P,FFIND ;FIND THE FILE, MAP IT IN, SET KLGF/KLGP + POPJ P, + JRST READS4 + +FFIND: SETZM KLGP + PUSH P,E ;ABSADR WILL CLOBBER/READS0 WILL POP + MOVE T,DR.PBN(E) + MOVEM T,P.B.N. ;SAVE P.B.N. FOR CONSISTENCY CHECK ETC. + HRRZ T,DR.WRT(E) ;GET NUMBER OF WORDS WRITTEN + HLRZ A,DR.WRT(E) + LSH A,16. + ADDI A,1(T) + LSH A,-1 ;# WDS IN FILE 10-STYLE + HLLZ T,DR.STS(E) ;CHECK TYPE OF FILE + JUMPN T,READS1 ;JUMP IF NO ASSOCIATED ITS FILE + MOVE B,FN1 + MOVE C,FN2 + SKIPE FAKE + JRST READS0 + PUSHJ P,ABSADR ;HAS ASSOCIATED ITS FILE, FIND IT + JRST READFU ;FILE NOT CONTIG + CAME B,P.B.N. + JRST READFU ;NOT IN SAME PLACE AS FE DIR SAID + MOVE B,FN1 + MOVE C,FN2 + JRST READS0 + +READS1: LDB B,[101000,,P.B.N.] + IMULI B,NSECS + LDB C,[001000,,P.B.N.] + ADD B,C ;SECTOR # WITHIN CYLINDER OF THIS FILE + MOVEM B,DADR' + MOVEI T,177(A) + LSH T,-7 + ADD T,B + MOVEM T,DADRE' + HLRZ T,P.B.N. + MOVEM T,DACYL' + MOVE B,TICFN1 + MOVE C,TICFN2 + MOVEM B,SMLFN1 + MOVEM C,SMLFN2 +READS2: MOVE B,SMLFN1 ;CHECK A 'SMALL FILES' FILE + MOVE C,SMLFN2 ;TO SEE IF IT CONTAINS THIS FILE + PUSHJ P,ABSADR + JRST READS9 + HLRZ T,B + CAME T,DACYL + JRST READS3 + LDB T,[101000,,B] + IMULI T,NSECS + ANDI B,377 + ADD B,T + CAMLE B,DADR + JRST READS3 + ADD C,B + CAMGE C,DADRE + JRST READS3 + SUB B,DADR + LSH B,7 + MOVNM B,KLGP ;WORD OFFSET OF SMALL FILE FROM START OF BIG FILE + MOVE B,SMLFN1 + MOVE C,SMLFN2 + JRST READS0 + +READS3: AOS SMLFN2 + JRST READS2 + +READS9: POP P,E + HRROI T,[ASCIZ/'SMALL' FILE SEEMS TO HAVE VANISHED/] + MOVEM T,ERROR + JRST FILERR + +READFU: POP P,E + HRROI T,[ASCIZ/INTERNAL FILE HAS BEEN MESSED OVER/] + MOVEM T,ERROR + JRST FILERR + +;HERE TO BEGIN READING, A HAS LENGTH, B AND C HAVE FILE NAMES OF CONTAINING FILE + +READS0: POP P,E + .CALL [ SETZ ;OPEN THE CORRESPONDING ITS FILE + SIXBIT /OPEN/ + [.BAI,,ALCH] + CTGDEV + B + C + CTGDIR + ERCODE ERROR ] + JRST [ MOVE T,CTGDEV + MOVEM T,DEV + MOVE T,CTGDIR + MOVEM T,SNM + MOVEM B,FN1 + MOVEM C,FN2 + JRST FILERR ] + PUSHJ P,MAPFIL ;MAP IT IN + POPJ P, + JRST POPJ1 + +;HERE REALLY TO BEGIN READING, FILE HAS BEEN MAPPED IN + +READS4: PUSHJ P,CNVRTP ;SEE IF HAVE TO CONVERT BACK TO 10-STYLE ASCII + .CALL [ SETZ ;OPEN THE FILE WE'RE GOING TO WRITE INTO + SIXBIT /OPEN/ + [.BAO,,DKOC] + DEV + FN1 + FN2 + SNM + ERCODE ERROR ] + JRST FILERR + SKIPE CNVRTF + JRST READF1 + MOVE B,[A,,FILE-1] + ADD B,KLGP ;B -> FIRST WORD MINUS ONE OF DATA, + INDEXED BY A + MOVE T,DR.WRT(E) ;IF ODD NUMBER OF -11 WORDS, + TRNE T,1 + HLLZS @B ;ZERO THE UNWRITTEN WORD + MOVNS A ;SET UP AOBJN POINTER TO WHOLE FILE + HRLZS A + HRRI A,1(B) + .IOT DKOC,A ;WRITE IT ALL OUT +READF0: .CLOSE DKOC, + .CLOSE ALCH, + PUSHJ P,UNMAPF + JRST POPJ1 + +;READ FILE OFF OF -11 WITH ASCII CONVERSION +;PRESENTLY THIS ROUTINE HAS THE BUG THAT NUMBER OF TRAILING NULLS KEEPS GROWING + +READF1: MOVE TT,[101000,,FILE-1] ;WEIRD BYTE POINTER TO INPUT FILE + ADD TT,KLGP + IMULI A,4 ;COMPUTE NUMBER OF BYTES IN INPUT + MOVE T,DR.WRT(E) ;IF ODD NUMBER OF 11 WORDS, + TRNE T,1 + SUBI A,2 ; THERE ARE TWO FEWER BYTES +READF2: MOVEI D,LBUF*5 ;OUTPUT BUFFER COUNTER + MOVE E,[440700,,BUF] ;OUTPUT BUFFER POINTER +READF3: TLNE TT,100000 ;NOW FIGURE OUT HOW TO INCREMENT WIERD POINTER + JRST READF4 + ADD TT,[100000,,] ;22->32 OR 00->10 + JRST READF5 + +READF4: TLNE TT,200000 + TLZA TT,320000 ;32->00 + ADD TT,[120000,,1] ;10->22 OF NEXT WORD +READF5: LDB T,TT ;GET NEXT CHARACTER OF INPUT + IDPB T,E ;STORE IT AWAY + SOJLE A,READF6 + SOJG D,READF3 ;LOOP UNLESS OUTPUT BUFFER FULL + MOVE D,[-LBUF,,BUF] + .IOT DKOC,D + JRST READF2 + +READF6: MOVEI T,5*LBUF-1 ;EOF, FINISH OUTPUT FILE + SUB T,D ;T := # CHARS WRITTEN + IDIVI T,5 ;# WORDS + JUMPE TT,READF7 + MOVEI T,0 ;PAD TO WORD BOUNDARY WITH NULLS + IDPB T,E + SOJA D,READF6 + +READF7: HRLOI T,-BUF(E) + EQVI T,BUF + .IOT DKOC,T + JRST READF0 + +;WRITE COMMAND + +WRITF: SKIPE FAKE + JRST [ HRROI T,[ASCIZ/CAN'T WRITE INTO FAKE FILE SYSTEM/] + MOVEM T,ERROR + JRST ERPNT ] + PUSHJ P,MAPDIR + .VALUE + .CALL [ SETZ + SIXBIT /OPEN/ + [.BAI,,DKIC] + DEV + FN1 + FN2 + SNM + ERCODE ERROR ] + JRST FILERR + PUSHJ P,CNVRTP ;SEE IF CONVERSION NECESSARY + .CALL [ SETZ + 'FILLEN + MOVEI DKIC + SETZM A ] + .VALUE + SKIPN CNVRTF + JRST WRT11 + IMULI A,5 ;5 CHARS/WD -> 4 CHARS/WD + ADDI A,3 + IDIVI A,4 +;DROPS THROUGH INTO WRT11 + +;WRITE A FILE INTO THE 11 DIRECTORY +;CALL WITH FILE NAMES SET UP IN DEV,SNM,FN1,FN2 +;FILE OPEN ON DKIC, FILE LENGTH IN A, DIR ALREADY MAPPED +;SKIP RETURN IF WIN + +WRT11: PUSH P,A + MOVE A,FN1 ;SET UP DIR ENTRY + PUSHJ P,SQUEEZ + HRRZM B,SQZFN1' + MOVSS A + PUSHJ P,SQUEEZ + HRLM B,SQZFN1 + MOVS A,FN2 + PUSHJ P,SQUEEZ + HRLZM B,SQZFN2' + MOVE C,SQZFN1 + MOVE D,SQZFN2 + PUSHJ P,11LOOK ;SEE IF FILE ALREADY EXISTS + JRST WRT11R ;DOESN'T EXIST + HLRZ T,DR.ALC(E) ;ALREADY EXISTS, CAN WE RE-USE IT? + LSH T,16. + HRRZ TT,DR.ALC(E) + ADD T,TT + LSH T,-1 ;# PDP10 WORDS ALLOCATED IN OLD VERSION + ADDI T,177 + ANDCMI T,177 + CAMGE T,(P) ;SKIP IF ENOUGH + JRST WRT11Q + LSH T,-7 + MOVEM T,N.C.B. + MOVEM E,DIRIDX + PUSHJ P,FFIND ;OK, MAP THE OLD FILE IN + JRST POPAJ + .CALL [ SETZ + 'RQDATE + SETZM TT ] + .VALUE + .CALL [ SETZ + 'SFDATE + MOVEI ALCH + SETZ TT ] + .VALUE + POP P,A + MOVEI TT,FILE + ADD TT,KLGP + SETOM KLGF ;FILE ALREADY EXISTS, DON'T RENAME + JRST WRT11A + +WRT11R: SETO E, ;FILE DOESN'T EXIST, REMEMBER TO CREATE DIR ENTRY +WRT11Q: MOVEM E,DIRIDX' + POP P,A + CAIL A,4000 ;IF LESS THAN 2 BLOCKS, USE THE KLUDGE + JRST WRT11K ;JUMP IF WRITING NORMAL FILE + JRST TOAD3 ;WRITE SMALL FILES DIFFERENTLY + +;THIS KLUDGE IS AN EFFORT TO AVOID "DIRECTORY FULL" +;BY PUTTING SEVERAL SMALL FILES INTO ONE FILE. + +TOAD3: MOVE T,A + ADDI T,177 + LSH T,-7 + MOVEM T,N.C.B1' + MOVE B,TICFN1 + MOVE C,TICFN2 + MOVEM B,SMLFN1' ;LOOK FOR FREE SPACE IN HERE + MOVEM C,SMLFN2' +TOAD4: MOVE B,SMLFN1 + MOVE C,SMLFN2 + PUSHJ P,ABSADR + JRST [ PUSH P,A ;OK, MAKE A TIC FILE + MOVEI T,[ASCIZ/MAKING /] + PUSHJ P,7TYPE + MOVE A,SMLFN1 + PUSHJ P,SIXTYO + .IOT TYOC,[40] + MOVE A,SMLFN2 + PUSHJ P,SIXTYO + .IOT TYOC,[15] + .IOT TYOC,[12] + MOVEI A,TICFSZ*128. + PUSHJ P,CTGALC + JRST [ POP P,A ? JRST ERPNT ] + .CALL [ SETZ + 'RENAME + CTGDEV + CTGFN1 + CTGFN2 + CTGDIR + SMLFN1 + SETZ SMLFN2 ] + .VALUE + POP P,A + JRST TOAD4 ] + MOVEM B,P.B.N. + .CALL [ SETZ + SIXBIT /OPEN/ + [.WOV,,ALCH] + CTGDEV + SMLFN1 + SMLFN2 + SETZ CTGDIR ] + .LOSE 1000 + PUSHJ P,MAPFIL + POPJ P, + SKIPN FILE ;IF NEW FILE, + AOS FILE ; INITIALIZE TO SKIP "HEADER SECTOR" + MOVE T,N.C.B1 ;SECTORS THIS FILE + MOVEM T,N.C.B. + ADD T,FILE ;COMPUTE SIZE OF TIC FILE IF THIS ONE INSERTED + CAIG T,TICFSZ + JRST TOAD5 ;IT FITS + AOS SMLFN2 ;IT DOESN'T, START ANOTHER TIC FILE + JRST TOAD4 + +TOAD5: MOVE T,FILE ;-> FIRST FREE SECTOR + LDB TT,[001000,,P.B.N.] + ADD T,TT ;NOW BUMP P.B.N. + IDIVI T,NSECS + DPB TT,[001000,,P.B.N.] + LDB TT,[101000,,P.B.N.] + ADD T,TT + IDIVI T,NHEDS + DPB TT,[101000,,P.B.N.] + JUMPN T,[.VALUE] ;WOOPS! CROSSED CYLINDER BOUNDARY + MOVE TT,N.C.B. ;BUMP FREE POINTER + ADD TT,FILE + EXCH TT,FILE + LSH TT,7 + MOVEM TT,KLGP' ;REL LOC IN BIG FILE OF SMALL FILE + SETOM KLGF' ;SUPPRESS RENMWO'S + ADDI TT,FILE + JRST WRT11A ;COPY FILE OVER & MAKE DIR + +WRT11K: SETZM KLGP + SETZM KLGF + PUSHJ P,CTGALC ;MAKE SUITABLE FILE + JRST FILERR + MOVE T,N.C.B. ;ROUND NCB UP TO MULTIPLE OF 1K BLOCKS + ADDI T,7 ;WHICH IS AMOUNT REALLY ALLOCATED + ANDCMI T,7 + MOVEM T,N.C.B. + .CALL [ SETZ ;MAP IT IN + SIXBIT /OPEN/ + [.WOV,,ALCH] + CTGDEV + CTGFN1 + CTGFN2 + CTGDIR + ERCODE ERROR ] + JRST FILERR + PUSHJ P,MAPFIL + POPJ P, + MOVEI TT,FILE ;COPY FILE +WRT11A: HRRZ T,TT ;TT -> 1ST WD TO WRITE INTO + SKIPE CNVRTF + JRST WRT11G +WRT11W: HRLI TT,-2000 + .IOT DKIC,TT + JUMPGE TT,WRT11W + JRST WRT11X + +;WRITE FILE CONVERTING 5-CHAR ASCII TO PDP11 BYTES + +WRT11G: PUSH P,T + MOVEI C,0 ;NUMBER OF BYTES WRITTEN SO FAR + SETZB D,E ;D COUNT OF BYTES REMAINING IN INPUT BUFFER, E B.P. + HRLI TT,101000 ;TT WIERD-ORDER BYTE POINTER TO FILE + SOS TT +WCNV1: SOJG D,WCNV2 ;HERE TO GET NEXT BYTE IN INTO T + MOVE D,[-LBUF,,BUF] ;HERE TO REFILL INPUT BUFFER + .IOT DKIC,D + MOVEI D,-BUF(D) ;NUMBER OF WORDS + JUMPE D,WCNV6 ;JUMP IF EOF + IMULI D,5 + MOVE E,[440700,,BUF] +WCNV2: ILDB T,E +WCNV7: TLNE TT,100000 ;NOW FIGURE OUT HOW TO INCREMENT WIERD POINTER + JRST WCNV3 + ADD TT,[100000,,] ;22->32 OR 00->10 + JRST WCNV4 + +WCNV3: TLNE TT,200000 + TLZA TT,320000 ;32->00 + ADD TT,[120000,,1] ;10->22 OF NEXT WORD +WCNV4: DPB T,TT + JRST WCNV1 + +WCNV6: MOVEI T,0 ;PAD TO WORD BOUND WITH NULLS + TLNN TT,200000 + TLNN TT,100000 ;LAST BYTE IN WORD HAS P=10 + JRST WCNV7 + AOS TT + POP P,T +WRT11X: SUB TT,T + HRRZS TT ;NUMBER OF WORDS WRITTEN + LSH TT,1 ;# WORDS PDP11 STYLE + MOVEM TT,LENGT' + .CLOSE DKIC, + SKIPE KLGF + JRST WRT11Y + HLRO TT,FN2 + .CALL [ SETZ + 'RENMWO + MOVEI ALCH + TT + FN1 + ERCODE ERROR ] + JRST FILERR + JRST WRT11Y + +WRT11Y: SKIPL E,DIRIDX + JRST WRT11F + MOVE C,[-2,,-2] ;FIND FREE FILE + MOVSI D,-2 + PUSHJ P,11LOOK + JRST [ HRROI T,[ASCIZ/11 DIR FULL/] + MOVEM T,ERROR + JRST FILERR ] +WRT11F: MOVE T,SQZFN1 + MOVEM T,DR.NAM(E) + MOVE T,SQZFN2 + HLLZM T,DR.EXT(E) + MOVE T,DATCFT + HRRM T,DR.DAT(E) + MOVE T,P.B.N. + MOVEM T,DR.PBN(E) + MOVE T,N.C.B. + LSH T,8 + IDIVI T,1_16. + MOVSM T,DR.ALC(E) + HRRM TT,DR.ALC(E) + MOVE T,LENGT + IDIVI T,1_16. + MOVSM T,DR.WRT(E) + HRRM TT,DR.WRT(E) + MOVE T,11ACFT + MOVEM T,DR.11A(E) + SETZB Q,DR.CKS(E) + SETZM DR.7(E) + MOVN TT,LENGT ;COMPUTE CHECKSUM + LSH TT,-1 + MOVSS TT + HRR TT,KLGP ;RELATIVE AOBJN PTR TO FILE +WRT11B: HRRZ T,FILE(TT) + ADD Q,T + TRZE Q,1_16. + AOS Q + HLRZ T,FILE(TT) + ADD Q,T + TRZE Q,1_16. + AOS Q + AOBJN TT,WRT11B +WRT11C: HRRZM Q,DR.CKS(E) ;STORE CHECKSUM, CLEAR DR.STS + MOVSI Q,1 + SKIPE KLGP + HLLM Q,DR.STS(E) ;KLUDGEY FILE, SET DR.STS TO 1 + LSH E,-10. ;WRITE OUT DIR + .CALL [ SETZ + 'PGWRIT + SETZI (E) ] + JFCL ;SIGH + SKIPE KLGF + JRST WRT11Z + .CALL [ SETZ + 'RENMWO + MOVEI ALCH + FN1 + FN2 + ERCODE ERROR ] + PUSHJ P,FILERR +WRT11Z: .CALL [ SETZ ;DON'T BOTHER DUMPING THIS FILE + 'SDMPBT + MOVEI ALCH + SETZI 1 ] + .CLOSE ALCH, + PUSHJ P,UNMAPF + JRST POPJ1 + +;LOOK UP FILE IN 11 DIRECTORY +;IF NOT FOUND, NO SKIP RETURN +;IF FOUND, SKIP RETURN WITH E POINTING AT THE ENTRY +;COME IN WITH C AND D CONTAINING THE SQUOZE + +11LOOK: MOVEI E,DIR-8 +11LKA: ADDI E,8 + CAML E,DIREND + POPJ P, + MOVE T,C + MOVE TT,D + XOR T,DR.NAM(E) + XOR TT,DR.EXT(E) + TLNN TT,177777 + TDNE T,[177777,,177777] + JRST 11LKA + JRST POPJ1 + +;RENAME FILE IN -11 DIRECTORY + +RENAME: PUSHJ P,MAPDIR + .VALUE + PUSH P,FN1 + PUSH P,FN2 +RENAM1: MOVEI T,[ASCIZ/(NEW NAME) /] + SKIPN JCLF + PUSHJ P,7TYPE + PUSHJ P,FNR + JRST RENAM1 + MOVE T,FN1 + MOVEM T,NEWFN1 + MOVEM T,NUFN1' + MOVE T,FN2 + MOVEM T,NEWFN2 + MOVEM T,NUFN2' + POP P,FN2 + POP P,FN1 + MOVE A,NEWFN1 + PUSHJ P,SQUEEZ + HRRZM B,NEWFN1 + MOVSS A + PUSHJ P,SQUEEZ + HRLM B,NEWFN1 + MOVS A,NEWFN2 + PUSHJ P,SQUEEZ + HRLZM B,NEWFN2 + MOVE C,NEWFN1 + MOVE D,NEWFN2 + PUSHJ P,11LOOK + CAIA + JRST RNMDUP ;NAME DUPLICATION + PUSHJ P,FDELE ;DO RENAME IN 11 DIR + POPJ P, ;LOST + HLLZ A,DR.STS(E) + JUMPN A,POPJ1 ;JUMP IF HAS NO ASSOCIATED ITS FILE + .CALL [ SETZ + SIXBIT/OPEN/ + [.UII,,ALCH] + CTGDEV + FN1 + FN2 + CTGDIR + ERCODE ERROR ] + JRST FILERR + .CALL [ SETZ + 'RENAME ;DON'T USE RENMWO!! + CTGDEV + FN1 + FN2 + CTGDIR + NUFN1 + NUFN2 + ERCODE ERROR ] + JRST FILERR + .CALL [ SETZ ;DON'T BOTHER DUMPING IT ON BACKUP TAPE + 'SDMPBT ;SINCE RELOADING IT WOULD LOSE. + MOVEI ALCH + SETZI 1 ] + .VALUE + .CLOSE ALCH, + JRST POPJ1 + +;DELETE FILE FROM -11 DIRECTORY +;NAMES IN FN1, FN2 + +DELETE: PUSHJ P,MAPDIR + .VALUE + .CALL [ SETZ + 'DELETE + CTGDEV + FN1 + FN2 + CTGDIR + ERCODE ERROR ] + PUSHJ P,FILERR + MOVE T,[-2,,-2] + MOVEM T,NEWFN1' + HLLZM T,NEWFN2' + +FDELE: MOVE A,FN1 + PUSHJ P,SQUEEZ + HRRZM B,SQZFN1 + MOVSS A + PUSHJ P,SQUEEZ + HRLM B,SQZFN1 + MOVS A,FN2 + PUSHJ P,SQUEEZ + HRLZM B,SQZFN2 + + MOVE C,SQZFN1 + MOVE D,SQZFN2 + PUSHJ P,11LOOK + JRST DELFNF + MOVE T,NEWFN1 + MOVEM T,DR.NAM(E) + MOVE T,NEWFN2 + HLLZM T,DR.EXT(E) + + MOVE T,E + LSH T,-10. ;WRITE OUT DIR + .CALL [ SETZ + 'PGWRIT + SETZI (T) ] + JFCL + JRST POPJ1 + +DELFNF: HRROI T2,[ASCIZ/FILE NOT FOUND IN FRONT-END DIRECTORY/] + MOVEM T2,ERROR + JRST FILERR + +RNMDUP: HRROI T2,[ASCIZ/FILE WITH THAT NAME ALREADY EXISTS IN FRONT-END DIRECTORY/] + MOVEM T2,ERROR + JRST FILERR + +XFILE: .CALL [ SETZ + SIXBIT/OPEN/ + [.UAI,,XFLC] + DEV + FN1 + FN2 + SNM + ERCODE ERROR ] + JRST FILERR + SETOM XFLF + JRST POPJ1 + +FFAKE: MOVE T,SNM + MOVEM T,CTGDIR + MOVEM T,DIRSNM + MOVSI T,'DSK + MOVEM T,DIRDEV + MOVEM T,CTGDEV + .CALL [ SETZ ? SIXBIT/OPEN/ ? [.BII,,ALCH] + DIRDEV ? FAKFN1 ? FAKFN2 ? DIRSNM ? ERCODE ERROR ] + .LOSE %LSFIL + MOVE A,[-2000,,FAKUFD] + .IOT ALCH,A + .CLOSE ALCH, + SETOM FAKE + SETZM GOTDIR + PUSHJ P,MAPDIR + .VALUE + JRST POPJ1 + +;PRINT ERROR MESSAGE, INCLUDING FILE NAME DEV:SNM;FN1 FN2 + +FILERR: MOVE A,DEV + PUSHJ P,SIXTYO + .IOT TYOC,[":] + MOVE A,SNM + PUSHJ P,SIXTYO + .IOT TYOC,[";] + MOVE A,FN1 + PUSHJ P,SIXTYO + .IOT TYOC,[40] + MOVE A,FN2 + PUSHJ P,SIXTYO + MOVEI T,[ASCIZ/ - /] + PUSHJ P,7TYPE ;FALL INTO ERPNT + + +;PRINT ERROR MESSAGE, CODE IN LOCATION ERROR + +ERPNT: SETZM JCLF ;STOP READING JCL + SKIPL T,ERROR + JRST ERPNT1 + PUSHJ P,7TYPE + JRST ERPNT3 + +ERPNT1: .CALL [ SETZ + SIXBIT /OPEN/ + [.UAI,,ERRC] + ['ERR,,] + MOVEI 4 + SETZ ERROR ] + .VALUE +ERPNT2: .IOT ERRC,T + CAIGE T,40 + JRST ERPNT3 + .IOT TYOC,T + JRST ERPNT2 + +ERPNT3: .CLOSE ERRC, + .IOT TYOC,[15] + .IOT TYOC,[12] + POPJ P, + +;TYPE OUT SIXBIT IN A + +SIXTYO: MOVE TT,A +SIXTY1: MOVEI T,0 + LSHC T,6 + ADDI T,40 + .IOT TYOC,T + JUMPN TT,SIXTY1 + POPJ P, + +;OCTAL TYPEOUT NUMBER IN T + +OTYO: IDIVI T,8 + HRLM TT,(P) + SKIPE T + PUSHJ P,OTYO + HLRZ TT,(P) + ADDI TT,"0 + .IOT TYOC,TT + POPJ P, + +;ASCIZ TYPEOUT FROM T + +7TYPE: HRLI T,440700 +7TYPE1: ILDB TT,T + JUMPE TT,CPOPJ + .IOT TYOC,TT + JRST 7TYPE1 + +;CALL WITH 3 SIXBIT CHARS IN RH OF A +;RETURN WITH PDP-11 STYLE SQUOZE IN B + +SQUEEZ: MOVE T2,[220600,,A] + MOVEI B,0 +SQZ1: ILDB T,T2 + MOVEI TT,35 ;DEFAULT FOR ILL CHRS + CAIN T,'$ + MOVEI TT,33 + CAIN T,'. + MOVEI TT,34 + CAIN T,0 + MOVEI TT,0 + CAIL T,'0 + CAILE T,'9 + SKIPA + MOVEI TT,36-'0(T) + CAIL T,'A + CAILE T,'Z + SKIPA + MOVEI TT,1-'A(T) + IMULI B,50 + ADD B,TT + TLNE T2,770000 + JRST SQZ1 + POPJ P, + +;CALL WITH PDP-11 STYLE SQUOZE IN B +;3 SIXBIT CHARS ARE DEPOSITED INTO RH OF A + +EXPAND: MOVE T2,[220600,,A] + MOVE T,B + IDIVI T,50 + PUSH P,TT + IDIVI T,50 + PUSH P,TT + PUSHJ P,EXPND1 + POP P,T + PUSHJ P,EXPND1 + POP P,T + PUSHJ P,EXPND1 + POPJ P, + +EXPND1: JUMPE T,EXPND4 + CAIG T,32 + JRST EXPND2 + CAIL T,36 + JRST EXPND3 + MOVE T,['$ ? '. ? '%](T) + JRST EXPND4 + +EXPND2: ADDI T,'A-1 + JRST EXPND4 + +EXPND3: ADDI T,'0-36 +EXPND4: IDPB T,T2 + POPJ P, + +;SET UP CNVRTF ACCORDING TO WHETHER FILE NAME INDICATES +;ASCII FORMAT CONVERSION IS REQUIRED + +CNVRTP: SETOM CNVRTF' ;ASSUME YES + MOVE T,FN2 + MOVSI TT,-LEXTTB + CAME T,EXTTB(TT) + AOBJN TT,.-1 + JUMPGE TT,CPOPJ ;NOT IN TABLE, NEEDS CONVERSION + SETZM CNVRTF ;IN TABLE, NEEDS NO CONVERSION + POPJ P, + +EXTTB: SIXBIT /ABS/ ;TABLE OF NON-ASCII EXTENSIONS + SIXBIT /BIC/ + SIXBIT /BIN/ ;STRAIGHT FROM PMAKER + SIXBIT /CIL/ ;AS FAR AS I KNOW THE ONLY ONE OF THESE + SIXBIT /LBO/ ;ACTUALLY USED BY KLDCP IS 'BIN' + SIXBIT /LDA/ + SIXBIT /LDR/ + SIXBIT /LOD/ + SIXBIT /MFD/ + SIXBIT /OBJ/ + SIXBIT /SAV/ + SIXBIT /SYM/ + SIXBIT /SYS/ + SIXBIT /UFD/ +LEXTTB==.-EXTTB + +;E -> A DIRECTORY ENTRY. THIS ROUTINE TYPES IT OUT + +SHDIRE: HLRZ B,DR.NAM(E) + PUSHJ P,EXPAND + MOVSS A + HRRZ B,DR.NAM(E) + PUSHJ P,EXPAND + MOVEM A,FN1' + PUSHJ P,SIXTYO + .IOT TYOC,[11] + HLRZ B,DR.EXT(E) + PUSHJ P,EXPAND + HRLZS A + MOVEM A,FN2' + PUSHJ P,SIXTYO + MOVEI T,[ASCIZ/ CYL /] + PUSHJ P,7TYPE + HLRZ T,DR.PBN(E) + PUSHJ P,OTYO + MOVEI T,[ASCIZ/ SURF /] + PUSHJ P,7TYPE + LDB T,[101000,,DR.PBN(E)] + PUSHJ P,OTYO + MOVEI T,[ASCIZ/ SECT /] + PUSHJ P,7TYPE + LDB T,[001000,,DR.PBN(E)] + PUSHJ P,OTYO + MOVEI T,[ASCIZ/ ALLOC /] + PUSHJ P,7TYPE + HLLZ T,DR.ALC(E) + LSH T,-2 + HRRZ TT,DR.ALC(E) + IOR T,TT + PUSHJ P,OTYO + MOVEI T,[ASCIZ/ WRITTEN /] + PUSHJ P,7TYPE + HLLZ T,DR.WRT(E) + LSH T,-2 + HRRZ TT,DR.WRT(E) + IOR T,TT + PUSHJ P,OTYO + .IOT TYOC,[15] + .IOT TYOC,[12] + POPJ P, + +;TAPE RELOADER + +LOAD: SETZM CNVRTF ;ALL FILES ALREADY IN PDP11 FORMAT + SETZM KLGF + SETZM KLGP + PUSHJ P,TAPOPN + POPJ P, + MOVE T,[-8,,BUF] ;READ DIRECTORY HEADER + .IOT DKIC,T + JUMPL T,[HRROI TT,[ASCIZ/END OF TAPE/] + MOVEM TT,ERROR + JRST ERPNT ] + MOVSI T,'DSK + MOVEM T,DEV + MOVE T,CTGDIR + MOVEM T,SNM + MOVEI E,BUF + PUSHJ P,SHDIRE ;TYPE OUT STUFF, SET UP FN1 AND FN2 + MOVE T,FN1 ;FLUSH "FOO" FILES + MOVE TT,FN2 + CAME T,[SIXBIT/FOO/] + CAMN TT,[SIXBIT/FOO/] +LOADF0: JRST LOADF ;JFCL THIS IF YOU WANT TO LOAD "FOO" FILES + HRRZ T,DR.DAT(E) ;PRESERVE CRUFTY DATE + MOVEM T,DATCFT' + MOVE T,DR.11A(E) ;AND -11 ADDRESSES + MOVEM T,11ACFT' + HRRZ T,DR.ALC(E) ;ALLOCATE SAME AMOUNT + HLRZ A,DR.ALC(E) + LSH A,16. + ADDI A,1(T) + LSH A,-1 ;CONVERT # 11 WDS TO # 10 WDS + PUSHJ P,WRT11 ;WRITE INTO PDP11 DIR + JFCL ;BARF! + JRST LOAD ;NEXT FILE + +LOADF: MOVEI T,[ASCIZ/FLUSHED +/] + PUSHJ P,7TYPE + JRST LOAD + +TAPOPN: .CALL [ SETZ + SIXBIT/OPEN/ + [.BII,,DKIC] + [SIXBIT/MT0/] + [SIXBIT/MTAPE/] + [SIXBIT/INPUT/] + ERCODE ERROR ] + CAIA + JRST POPJ1 + MOVEI T,[ASCIZ/MT0: - /] + PUSHJ P,7TYPE + JRST ERPNT + +;DIRECTORY LISTER + +LISTF: PUSHJ P,LISTF0 + PUSHJ P,SHDIRE ;MATCHES, PRINT IT + JRST POPJ1 + +;ITERATE OVER THE DIRECTORY, EXECUTING NEXT INSTRUCTION FOR MATCHING FILES +;DON'T CLOBBER E +LISTF0: SETZM MASK1' ;MAKE MASKS FOR MATCH + SETZM MASK2' + MOVE T,FN1 + MOVEM T,FN1H' + JUMPE T,LISTF2 + CAMN T,[SIXBIT/*/] + JRST LISTF2 + SETO A, + MOVEI B,6 +LISTF1: MOVE TT,T + ANDI TT,77 + CAIN TT,'* + TRZ A,77 + ROT T,6 + ROT A,6 + SOJG B,LISTF1 + MOVEM A,MASK1 + +LISTF2: MOVE T,FN2 + MOVEM T,FN2H' + JUMPE T,LISTF4 + CAMN T,[SIXBIT/*/] + JRST LISTF4 + SETO A, + MOVEI B,6 +LISTF3: MOVE TT,T + ANDI TT,77 + CAIN TT,'* + TRZ A,77 + ROT T,6 + ROT A,6 + SOJG B,LISTF3 + MOVEM A,MASK2 + +LISTF4: MOVEI E,DIR ;RUN THROUGH DIRECTORY +LISTF5: CAML E,DIREND + JRST POPJ1 + MOVE T,DR.NAM(E) ;SKIP FREE FILES + XOR T,[177776,,177776] + TDNN T,[177777,,177777] + JRST LISTF6 + HLRZ B,DR.NAM(E) + PUSHJ P,EXPAND + MOVSS A + HRRZ B,DR.NAM(E) + PUSHJ P,EXPAND + MOVEM A,NEWFN1 + HLRZ B,DR.EXT(E) + PUSHJ P,EXPAND + HRLZM A,NEWFN2 + + MOVE T,FN1H + XOR T,NEWFN1 + AND T,MASK1 + JUMPN T,LISTF6 + MOVE T,FN2H + XOR T,NEWFN2 + AND T,MASK2 + JUMPN T,LISTF6 + + XCT @(P) ;FILE MATCHES, PROCESS IT +LISTF6: ADDI E,8 + JRST LISTF5 + +;COMMAND PROCESSOR + +GO: JSP TT,INIT + JRST GO0 + +RESTRT: MOVE P,PDL + SETZM JCLF + SETZM XFLF +GO0: MOVEI T,[ASCIZ/ +#/] + SKIPN JCLF + PUSHJ P,7TYPE + PUSHJ P,GETSYL ;READ COMMAND NAME + JRST RESTRT + JUMPE A,GONOCM + MOVSI TT,-LCMDTB + CAME A,CMDNAM(TT) + AOBJN TT,.-1 + JUMPGE TT,GOBARF + CAIN T,"? + JRST ONEHLP + SKIPL CMDDSP(TT) + JRST CMD1 + PUSH P,TT +CMD2: MOVEI T,[ASCIZ/(FILE) /] + SKIPN JCLF + PUSHJ P,7TYPE + PUSHJ P,FNR + JRST CMD2 + POP P,TT +CMD1: PUSHJ P,@CMDDSP(TT) + JRST RESTRT ;COMMAND FAILED + SKIPL JCLF2 ;COMMAND WON + JRST GO0 ;GET ANOTHER FROM TTY + .BREAK 16,160000 ;THIS WAS FROM JCL, SO AUTO QUIT + +GONOCM: CAIN T,"? + JRST ALLHLP +GOBARF: MOVEI T,[ASCIZ/??/] + PUSHJ P,7TYPE + JRST RESTRT + +ONEHLP: MOVE T,CMDHLP(TT) + PUSHJ P,7TYPE + JRST GO0 + +ALLHLP: MOVSI E,-LCMDTB +ALLHL0: .IOT TYOC,[15] + MOVE A,CMDNAM(E) + PUSHJ P,SIXTYO + .IOT TYOC,[11] + MOVE T,CMDHLP(E) + PUSHJ P,7TYPE + AOBJN E,ALLHL0 + JRST RESTRT + +CMDNAM: SIXBIT/DELETE/ + SIXBIT/LISTF/ + SIXBIT/MTDUMP/ + SIXBIT/MTLOAD/ + SIXBIT/QUIT/ + SIXBIT/READ/ + SIXBIT/RENAME/ + SIXBIT/REWIND/ + SIXBIT/TLIST/ + SIXBIT/TREAD/ + SIXBIT/WRITE/ + SIXBIT/FAKE/ + SIXBIT/XFILE/ +LCMDTB==.-CMDNAM + +CMDDSP: SETZ DELETE + SETZ LISTF + SETZ DUMP + LOAD + [.BREAK 16,160000] + SETZ READF + SETZ RENAME + REWIND + TLIST + SETZ TREAD + SETZ WRITF + SETZ FFAKE + SETZ XFILE +IFN .-CMDDSP-LCMDTB, .ERR CMDDSP LOSES + +CMDHLP: [ASCIZ\DELETE A FRONT-END FILE\] + [ASCIZ\LIST FRONT-END FILES THAT MATCH *-NAME\] + [ASCIZ\DUMP FRONT-END FILES THAT MATCH *-NAME ONTO MAG TAPE\] + [ASCIZ\LOAD A MAG TAPE OF FRONT-END FILES\] + [ASCIZ\:KILL KLFEDR\] + [ASCIZ\READ A FRONT-END FILE INTO ITS FILE OF SAME NAME\] + [ASCIZ\RENAME A FRONT-END FILE\] + [ASCIZ\REWIND TAPE\] + [ASCIZ\LIST FILES ON FRONT-END TAPE\] + [ASCIZ\READ A FILE FROM FRONT-END TAPE INTO ITS FILE OF SAME NAME\] + [ASCIZ\WRITE AN ITS FILE INTO A FRONT-END FILE OF SAME NAME\] + [ASCIZ\ACCESS A FAKE FRONT-END FILE SYSTEM IN ANOTHER DIRECTORY\] + [ASCIZ\EXECUTE COMMAND FILE\] +IFN .-CMDHLP-LCMDTB, .ERR CMDHLP LOSES + +REWIND: PUSHJ P,TAPOPN + POPJ P, + MOVE A,[DKIC,,B] + MOVE B,[-1,,1] + .MTAPE A, + JRST [ HRROI TT,[ASCIZ\.MTAPE FAILED TO SKIP\] + MOVEM TT,ERROR + JRST ERPNT ] + JRST POPJ1 + +TPOPEN: PUSHJ P,TAPOPN + POPJ P, + MOVE T,[-8,,MTDIRE] ;READ DIRECTORY HEADER + .IOT DKIC,T + JUMPL T,[HRROI TT,[ASCIZ/END OF TAPE/] + MOVEM TT,ERROR + JRST ERPNT] + MOVEI E,MTDIRE + JRST POPJ1 + +TLIST: PUSHJ P,TPOPEN + POPJ P, + PUSHJ P,SHDIRE + .CLOSE DKIC, + JRST TLIST ;NEXT FILE + +TREAD: PUSHJ P,TPOPEN ;GET A FILE + POPJ P, + HLRZ B,DR.NAM(E) ;SEE IF RIGHT ONE + PUSHJ P,EXPAND + MOVSS A + HRRZ B,DR.NAM(E) + PUSHJ P,EXPAND + CAME A,FN1 + JRST TREAD + HLRZ B,DR.EXT(E) + PUSHJ P,EXPAND + HRLZS A + CAME A,FN2 + JRST TREAD + PUSHJ P,SHDIRE ;GOT RIGHT ONE, TELL LOSER + MOVEI B,FILE ;READ IT IN +TREAD1: HRLI B,-2000 ;AOBJN POINTER TO BUFFER PAGE + LDB TT,[121000,,B] ;BUFFER PAGE NUMBER + CAIL TT,FILPG + CAIL TT,FILPG+NFILPG + JRST [HRROI TT,[ASCIZ\FILE TOO BIG\] + MOVEM TT,ERROR + JRST ERPNT] + .CALL [ SETZ ;GET BUFFER + 'CORBLK + MOVEI %CBRED+%CBWRT+%CBNDR+%CBNDW + MOVEI %JSELF + TT + SETZI %JSNEW ] + .LOSE 1000 + .IOT DKIC,B ;READ IN TO BUFFER + JUMPGE B,TREAD1 ;COUNTED OUT, GET MORE + SETZM KLGP + SETZM KLGF + HRRZ T,DR.WRT(E) ;GET NUMBER OF WORDS WRITTEN + HLRZ A,DR.WRT(E) + LSH A,16. + ADDI A,1(T) + LSH A,-1 ;# WDS IN FILE 10-STYLE + JRST READS4 + +MTDIRE: BLOCK 8 + +DUMP: PUSHJ P,LISTF0 + PUSHJ P,DUMP0 + JRST POPJ1 + +;E -> A DIRECTORY ENTRY. DUMP IT ON TAPE. +DUMP0: HLRZ B,DR.NAM(E) + PUSHJ P,EXPAND + MOVSS A + HRRZ B,DR.NAM(E) + PUSHJ P,EXPAND + MOVEM A,FN1 + HLRZ B,DR.EXT(E) + PUSHJ P,EXPAND + HRLZS A + MOVEM A,FN2 + PUSHJ P,FFIND + JRST [ HRROI T,[ASCIZ/FILE NOT DUMPED TO TAPE +/] + PUSHJ P,7TYPE + POPJ P, ] + .CALL [ SETZ + SIXBIT/OPEN/ + [.BIO,,DKOC] + [SIXBIT/MT0/] + [SIXBIT/MTAPE/] + [SIXBIT/OUTPUT/] + ERCODE ERROR ] + JRST [ MOVEI T,[ASCIZ/MT0: - /] + PUSHJ P,7TYPE + POP P,T + JRST ERPNT ] + MOVEI B,(E) ;WRITE DIRECTORY ENTRY + HRLI B,-8 + .IOT DKOC,B + MOVE B,[A,,FILE-1] + ADD B,KLGP ;B -> FIRST WORD MINUS ONE OF DATA, + INDEXED BY A + MOVE T,DR.WRT(E) ;IF ODD NUMBER OF -11 WORDS, + TRNE T,1 + HLLZS @B ;ZERO THE UNWRITTEN WORD + MOVNS A ;SET UP AOBJN POINTER TO WHOLE FILE + HRLZS A + HRRI A,1(B) + .IOT DKOC,A ;WRITE IT ALL OUT + .CLOSE DKOC, + .CLOSE ALCH, + PUSHJ P,UNMAPF + POPJ P, + +END GO