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 ADD TT,[060000,,] SKIPN DISTTY JRST [ .IOT TYOC,T JRST GETSY0 ] .IOT TYOC,[^P] .IOT TYOC,["X] 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 READFX: 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 READFX 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: .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 ] 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/ERROR RETURN FROM FFIND??/] MOVEM T,ERROR 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