;***************************************************************************;
; ;
; 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$DAT!T$ECS>,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$DAT!T$ECS>,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<F.NXT>,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