;***************************************************************************; ; ; ; DIRSER ; ; Directory Service Utility ; ; ; ; Author: David F. Pallmann ; ; Copyright (C) 1984 by LMS Technical Services, Inc. ; ; ; ;***************************************************************************; ; ; File uses universal (.UNV) files other ; than SYS, SYSSYM, and TRM. ; These are on the AMUS network ; ; File makes external references to WLDSCN.OBJ[P,PN]. After ; assembly, enter this command: .LNKLIT file,WLDSCN[P,PN] ; OBJNAM DIRSER.LIT VMAJOR=1 ;edit history VEDIT=100. ;11-Jan-84 DFP creation. ;universals SEARCH SYS SEARCH SYSSYM SEARCH TRM SEARCH MACLIB SEARCH WLDSCN ASMMSG "(WLDSCN must be linked to this module after assembly)" ;registers IMP=A5 ;impure index ;ASCII chars CR=15 ESC=33 ;DDB offsets D.BLK=D.WRK+2 ;file block size D.ACT=D.WRK+6 ;active count ;impure area .OFINI .OFDEF FILE,D.DDB ;DDB for disk file operations .OFDEF LSTDEV,2 ;last device displayed .OFDEF LSTDRV,2 ;last drive displayed .OFDEF LSTPPN,2 ;last PPN displayed .OFDEF FILCNT,4 ;number of files processed .OFDEF BLKCNT,4 ;block count .OFDEF DELBLK,4 ;blocks deleted .OFDEF BUFFER,10 ;PACK-UNPACK buffer .OFDEF FLAGS,4 ;control flags--. F.DIR=1 ; /D - directory F.KIL=2 ; /K - kill F.NXT=100000 ; find file in next PPN .OFSIZ IMPSIZ START: PHDR -1,0,PH$REE!PH$REU ;program header GETIMP IMPSIZ,IMP ;allocate impure area WINIT ;initialize WLDSCN PROGID: TYPESP DIRSER VCVT START+2,OT$TRM CRLF ;output a newline NEWLIN: CRLF ;prompt for file specification PROMPT: TTYI ASCIZ />/ ;set ASCII line mode SETASC: MOV JOBCUR,A0 MOV JOBTRM(A0),A0 ANDW #^C,T.STS(A0) ;get wildcard file specification GTSPEC: KBD EXIT ;get input line (branch on ^C) BYP ;bypass white space LIN ;empty line? JEQ EXIT ; yes - exit ;check for valid spec ;reject invalid spec CHKSPC: WSPEC BNE NEWLIN ;initialize storage INSTOR: CLRW LSTDEV(IMP) CLRW LSTDRV(IMP) CLRW LSTPPN(IMP) CLR FILCNT(IMP) CLR BLKCNT(IMP) CLR DELBLK(IMP) CLR FLAGS(IMP) CLRW FILE+D.DEV(IMP) CLRW FILE+D.DRV(IMP) CLRW FILE+D.PPN(IMP) ;process switches ;/D for directory only ;/K to delete all files SWITCH: BYP LIN JEQ SETDAT MOVB (A2)+,D1 AND #177,D1 UCS CMPB D1,#'/ BNE CMDERR MOVB (A2)+,D1 AND #177,D1 UCS LEA A0,SWCTBL MOV #1,D0 10$: TSTB @A0 BEQ CMDERR CMMB (A0)+,D1 BNE 20$ OR D0,FLAGS(IMP) BR SWITCH 20$: ASL D0 BR 10$ SWCTBL: ASCIZ /DK/ EVEN CMDERR: TYPECR ?command format error TTYI ASCIZ "?format is wildcard-spec {/D for directory} {/K to delete}" EVEN CRLF JMP NEWLIN ;set terminal to data mode, no echo SETDAT: MOV JOBCUR,A0 MOV JOBTRM(A0),A0 ORW #,T.STS(A0) ;request file from WLDSCN GETFIL: WSCAN JNE STATS ;copy file information returned by WLDSCN to our own DDB CPYDDB: MOVW D.DEV(A4),FILE+D.DEV(IMP) MOVW D.DRV(A4),FILE+D.DRV(IMP) MOV D.FIL(A4),FILE+D.FIL(IMP) MOVW D.EXT(A4),FILE+D.EXT(IMP) MOVW D.PPN(A4),FILE+D.PPN(IMP) MOVW D.BLK(A4),FILE+D.BLK(IMP) MOVW D.ACT(A4),FILE+D.ACT(IMP) INIT FILE(IMP) ;check for blank device/drive and/or PPN ;if present we must fill these areas so our display looks pretty CHKDEV: MOV JOBCUR,A0 TSTW FILE+D.DEV(IMP) BNE CHKPPN MOVW JOBDEV(A0),FILE+D.DEV(IMP) MOVW JOBDRV(A0),FILE+D.DRV(IMP) CHKPPN: TSTW FILE+D.PPN(IMP) BNE CHKNXT MOVW JOBUSR(A0),FILE+D.PPN(IMP) ;if control flag F.NXT set, then only display file if the device, drive, or ;PPN are different CHKNXT: BIT #F.NXT,FLAGS(IMP) BEQ DISACT CMMW FILE+D.DEV(IMP),LSTDEV(IMP) BNE 10$ CMMW FILE+D.DRV(IMP),LSTDRV(IMP) BNE 10$ CMMW FILE+D.PPN(IMP),LSTPPN(IMP) BNE 10$ JMP GETFIL 10$: AND #^C,FLAGS(IMP) ;if device/drive/PPN different than that of file last displayed, ;display the account on the screen DISACT: CMMW FILE+D.DEV(IMP),LSTDEV(IMP) BNE 10$ CMMW FILE+D.DRV(IMP),LSTDRV(IMP) BNE 10$ CMMW FILE+D.PPN(IMP),LSTPPN(IMP) BEQ RECFIL 10$: TST FILCNT(IMP) BEQ 20$ CRLF 20$: LEA A1,FILE+D.DEV(IMP) LEA A2,BUFFER(IMP) UNPACK CLRB @A2 TTYL BUFFER(IMP) CLR D1 MOVW FILE+D.DRV(IMP),D1 DCVT 0,OT$TRM TYPE :[ PRPPN FILE+D.PPN(IMP) TYPECR ] MOVW FILE+D.DEV(IMP),LSTDEV(IMP) MOVW FILE+D.DRV(IMP),LSTDRV(IMP) MOVW FILE+D.PPN(IMP),LSTPPN(IMP) ;record file size for end-of-directory statistics RECFIL: INC FILCNT(IMP) ;; LOOKUP FILE(IMP) CLR D1 MOVW FILE+D.BLK(IMP),D1 ADD D1,BLKCNT(IMP) ;display file DISFIL: LEA A1,FILE+D.FIL(IMP) LEA A2,BUFFER(IMP) UNPACK UNPACK CLRB @A2 TTYL BUFFER(IMP) TYPESP LEA A2,BUFFER(IMP) UNPACK CLRB @A2 TTYL BUFFER(IMP) TYPESP MOVW FILE+D.BLK(IMP),D1 DCVT 5,OT$TRM!OT$ZER!OT$TSP TSTW FILE+D.ACT(IMP) BMI 10$ TYPE L BR 20$ 10$: TYPE C 20$: TYPESP : ;auto-delete if /K in effect AUTDEL: BIT #F.KIL,FLAGS(IMP) JNE DELETE ;auto-bypass if /D in effect AUTBYP: BIT #F.DIR,FLAGS(IMP) JNE BYPASS ;get option char OPTION: KBD AND #177,D1 UCS LEA A0,CMDTBL MOV #-2,D0 10$: TSTB @A0 BEQ OPTION ADD #2,D0 CMMB (A0)+,D1 BNE 10$ BRANCH: TJMP D0 OFFSET BYPASS OFFSET QUIT OFFSET DELETE OFFSET HELP OFFSET LIST OFFSET NEXT OFFSET QUIT OFFSET BYPASS CMDTBL: BYTE CR,ESC ASCIZ /DHLNQ / EVEN ;end-of-directory statistics STATS: MOV FILCNT(IMP),D1 JNE 10$ TYPECR %no such files JMP NEWLIN 10$: TYPESP Total of DCVT 0,OT$TRM!OT$TSP TYPE file CMPW D1,#1 BEQ 20$ TYPE s 20$: TYPE < in > MOV BLKCNT(IMP),D1 DCVT 0,OT$TRM!OT$TSP TYPE block CMPW D1,#1 BEQ 24$ TYPE s 24$: MOV DELBLK(IMP),D1 BEQ 40$ TYPE < (> DCVT 0,OT$TRM!OT$TSP TYPE block CMPW D1,#1 BEQ 30$ TYPE s 30$: TYPE < deleted)> 40$: CRLF JMP NEWLIN ;exit to AMOS EXIT: CRLF EXIT PAGE ;delete file DELETE: TYPECR Delete CLR D1 MOVW FILE+D.BLK(IMP),D1 ADD D1,DELBLK(IMP) DSKDEL FILE(IMP) CLR D1 JMP GETFIL ;help HELP: TYPECR Help TYPECR < D - delete file> TYPECR < L - list file> TYPECR < N - next PPN> TYPECR < Q - quit> TYPECR < SP - bypass file> CRLF JMP DISFIL ;list file LIST: TSTW FILE+D.ACT(IMP) ;contiguous file? JMI OPTION ; yes - can't list file TYPECR List OPENI FILE(IMP) 10$: TCKI BEQ 20$ FILINB FILE(IMP) TST FILE+D.SIZ(IMP) BEQ 30$ TTY BR 10$ 20$: KBD 30$: CLOSE FILE(IMP) CRLF JMP DISFIL ;next PPN NEXT: TYPECR Next OR #F.NXT,FLAGS(IMP) JMP GETFIL ;quit QUIT: TYPECR Quit JMP STATS ;bypass file BYPASS: CRLF JMP GETFIL END .